如何让django admin将字段设置为NULL?

时间:2011-08-09 09:07:19

标签: python mysql sql django django-admin

我已将我的Model字段设置为null=True,它允许在MySQL中使用NULL,但我似乎无法通过Django Admin为该字段分配NULL。我也试过设置blank=True,但这只是将字段设置为空字符串。 this之后也不起作用,因为字段值设置为“无”,即字符串。

有什么想法吗?

6 个答案:

答案 0 :(得分:27)

尝试覆盖模型的save()方法,以检查空值:

class MyModel(models.Model):

    my_nullable_string = models.CharField(max_length=15, null=True, blank=True)

    def save(self, *args, **kwargs):
         if not self.my_nullable_string:
              self.my_nullable_string = None
         super(MyModel, self).save(*args, **kwargs)

答案 1 :(得分:17)

This section in the docs听起来像是无法通过管理员将基于字符串的字段设置为NULL;它将使用空字符串。这就是Django的做法。它适用于其他类型的领域。

你要么必须破解管理脚本,要么确定真的在数据库中不需要为NULL;一个空字符串就可以了。

答案 2 :(得分:7)

通常,当您同时传递null=Trueblank=True时,如果您在管理员中将该字段留空,Django将使用NULL作为其值。

编辑:

正如agf在他的回答中解释的那样,除CharFieldTextField之外的所有类型都是如此。

答案 3 :(得分:5)

试试这段代码,这里是Language.subregion hass null = True 此代码覆盖管理表单设置(LanguageAdmin)并设置“subregion”字段属性 - 需要为False

from app.models import Language
from django.contrib import admin

class Language(models.Model):
    subregion = models.ForeignKey(SubRegion, null=True)
    code = models.CharField(max_length=10, unique=True)

class LanguageAdmin(admin.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        form = super(LanguageAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['subregion'].required = False
        return form

admin.site.register(Language, LanguageAdmin)

答案 4 :(得分:4)

我经常将Django用于Admin,并且需要在db中保留很多NULL。我使用此代码段将特定对象上的所有空字符串设置为NULL。

def save(self, *args, **kwargs):
    for var in vars(self):
        if not var.startswith('_'):
            if self.__dict__[var] == '':
                self.__dict__[var] = None
    super(MyModel, self).save(*args, **kwargs)

答案 5 :(得分:2)

请注意,这在Django 2.0.1中已得到修复 - 从该版本开始,对于可以为空的Charfields,空值将保存为None。

票证:https://code.djangoproject.com/ticket/4136

提交:https://github.com/django/django/commit/267dc4adddd2882182f71a7f285a06b1d4b15af0