我在其中一个模型中有一个字段,如:
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
是实现这项工作的唯一方法吗?
答案 0 :(得分:2)
有两种方法可以解决这个问题。在ModelForm
:
required=False
。方式#1:
class MyForm(forms.ModelForm):
model = MyModel
exclude = ['field']
方式#2:
class MyForm(forms.ModelForm):
model = MyModel
field = forms.Charfield(required=False)
哪种方式更好?
如果您不希望field
可编辑,则应使用#1 。但是,如果您希望此字段可编辑但不是必需,请使用方式#2 。
答案 1 :(得分:1)
您可能需要阅读此source。
来自接受的答案
null=True
在您的数据库中的列上设置NULL
(与NOT NULL
)。 Django字段类型(如DateTimeField或ForeignKey)的空白值将作为NULL
存储在数据库中。
blank=True
确定表单中是否需要该字段。这包括管理员和您自己的自定义表单。如果blank = True则不需要该字段,而如果该字段为False,则该字段不能为空。
另外
来自source
readonly_fields将被排除在用于在管理员中创建和编辑的ModelForm中。
<强>更新强>
至于解决问题,您可以在模型中将其排除,或将字段设置为required = False。更多关于此source。