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

Hub*_*bro 33 python mysql sql django django-admin

我将我的Model字段设置为null=True,在MySQL中允许NULL,但我似乎无法通过Django Admin为字段分配NULL.我也尝试过设置blank=True,但这只是将字段设置为空字符串.下面这个没有任何工作,作为字段值被设置为"无",该字符串.

有任何想法吗?

rew*_*ten 31

尝试覆盖模型的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)
Run Code Online (Sandbox Code Playgroud)

  • 我需要将其与 pymen 的 get_form 答案结合起来,以便与 `blank=True, unique=True` 字段一起使用。 (2认同)

agf*_*agf 17

文档中的这一部分听起来好像你不能通过NULL管理员设置基于字符串的字段; 它将使用空字符串.这就是Django的做法.它适用于其他类型的领域.

你要么必须搞出管理脚本或其他决定它并不真的需要在数据库中NULL; 一个空字符串就可以了.

  • +1如果您正在处理的字段设置为"唯一",那么唯一的选择是"黑客入侵" (6认同)

mde*_*ous 8

通常,当你同时通过null=Trueblank=True,如果你离开在管理领域的空白,Django将使用NULL它的价值.

编辑:

正如agf他在回答中所解释的那样,除了CharField和之外,所有类型都是如此TextField.

  • 设置默认值=无帮助 (2认同)
  • 老兄,null 和空字符串不是一回事。一个中断和唯一约束,另一个没有。耶稣基督。懒洋洋地说,“嘿,它对我愚蠢的单元测试有效”就是为什么可怕的软件在生产中崩溃的原因。 (2认同)

Mar*_*lip 5

我经常仅将 Django 用于管理员,并且需要在数据库中保留大量 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)
Run Code Online (Sandbox Code Playgroud)


pym*_*men 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)
Run Code Online (Sandbox Code Playgroud)