当字段在 admin.py 中为只读时,模型字段 blank=false 不起作用



我在其中一个模型中有一个字段,如:

field = models.CharField(max_length=10, null=True)

我有

readonly_fields = ('field',)

当我试图从管理员那里保存它时,它不会抛出验证错误,这是非常正常的。

但如果我尝试在我的views.py,中这样做

form = MyForm(#some data here from request.POST)
print form.is_valid()

我得到错误说:

'this field is required'

这里,MyForm是用于该模型的ModelForm。我正在尝试创建另一个表单来替换管理员表单,这样我的团队就可以使用我创建的新表单而不是管理员。

我想通过我已经编写的ModelForm运行该表单,我不想重复代码并重新编写验证。

为什么管理表单和其他表单的这种行为不同?在我的模型中说blank=True是实现这一点的唯一方法吗?

有两种方法可以解决此问题。在您的ModelForm:中

  1. 要么排除该字段
  2. 或者将其设置为CCD_ 7

方式#1:

class MyForm(forms.ModelForm):
    model = MyModel
    exclude = ['field']

方式#2:

class MyForm(forms.ModelForm):
    model = MyModel
    field = forms.Charfield(required=False)

哪种方式更好

如果您不希望field是可编辑的,您应该使用方式#1。但是,如果您希望此字段可编辑,但不需要,请使用方式#2

您可能想要阅读此源代码。

根据已接受的答案

null=True在DB中的列上设置NULL(相对于NOT NULL)。Django字段类型(如DateTimeField或ForeignKey)的空值将作为NULL存储在DB中。

blank=True确定表单中是否需要该字段。这包括管理员和您自己的自定义表单。如果blank=True,则不需要该字段,而如果为False,则该字段不能为空。

此外

来自源

readonly_fields将被排除在用于在管理员中创建和编辑的ModelForm中。

更新

至于解决问题,您可以将其排除在模型表单中,或者将字段设置为required=False。更多关于这个来源。

最新更新