admin.py中只读字段时,模型字段blank=false无效
我在一个模型里有一个字段,内容是:
field = models.CharField(max_length=10, null=True)
在admin.py文件里,我有:
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
是不是唯一能让这个问题解决的方法?
2 个回答
你可能想看看这个链接。
来自被接受的回答
null=True
的意思是把数据库中这一列设置为可以为空(也就是NULL
),而不是必须有值(NOT NULL
)。像DateTimeField或ForeignKey这样的Django字段类型,如果没有值,就会在数据库里存成NULL
。
blank=True
则是决定这个字段在表单中是否是必填项。这包括管理员界面和你自己创建的表单。如果设置为blank=True,那么这个字段就不是必填的;如果设置为False,那这个字段就必须填写,不能留空。
另外
来自这个链接
readonly_fields在管理员界面创建和编辑时的ModelForm中会被排除。
更新
关于解决你的问题,你可以在你的modelform中排除这个字段,或者把这个字段设置为required=False。更多信息可以在这里找到这个链接。
你可以通过两种方式来解决这个问题。在你的 ModelForm
中:
- 可以选择不包含那个字段。
- 或者把它设置为
required=False
,表示这个字段不是必填的。
方法一:
class MyForm(forms.ModelForm):
model = MyModel
exclude = ['field']
方法二:
class MyForm(forms.ModelForm):
model = MyModel
field = forms.Charfield(required=False)
哪种方法更好呢?
如果你不想让这个 field
可以被编辑,那就选择 方法一。但如果你希望这个字段可以被编辑,但又不想让它成为必填项,那就选择 方法二。