我在其中一个模型中有一个字段,如:
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
:中
- 要么排除该字段
- 或者将其设置为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。更多关于这个来源。