我有一个ModelForm。有几个字段,如:
['display_from', 'display_to', 'position', 'image']
但是,display_from和display_to不在我的模板中。我想覆盖验证并在出现任何验证错误之前为这些字段分配一些值。我做过类似的事情:
def clean(self):
position = self.cleaned_data.get('position')
image = self.cleaned_data.get('image')
display_from = "value here"
display_to = "value here"
self.cleaned_data['display_from'] = display_from
self.cleaned_data['display_to'] = display_to
return self.cleaned_data
当我打印cleaning_data时,我可以看到终端中的值。但是,当我在页面上显示错误消息时,它告诉我需要display_from和display_to。
也许这不应该在clean()方法中完成?
我也尝试使用空的隐藏输入,但它没有用。有什么想法吗?
编辑:
排除字段没有帮助,它会返回IntegrityError消息:
null value in column "display_from" violates not-null constraint
答案 0 :(得分:1)
请记住,在模型上每个字段的各种clean_函数(docs here)之后,clean()函数被称为。
因此,那些单独的字段清理函数将引发ValidationErrors,它们会在clean()函数进入之前固定到form.errors dict并将默认值添加到cleaning_data dict。
您也可以继续使用已经开始的方法。只需从错误字典中删除错误。
def clean(self):
del form.errors['display_from']
del form.errors['display_to']
display_from = "value here"
display_to = "value here"
self.cleaned_data['display_from'] = display_from
self.cleaned_data['display_to'] = display_to
return self.cleaned_data
还有其他一些方法。
对于非常简单的情况,您可以在表单中使用隐藏字段。
您还可以覆盖clean_方法以返回适当的值。这些生成的值可以传递给ModelForm构造函数:
form = SomeModelForm(request.POST or None, initial={"option": "10"})
答案 1 :(得分:-1)
您需要将这些字段添加到exclude
元组:
class YourForm(forms.ModelForm):
class Meta:
exclude = ('display_from', 'display_to',)
model = YourModel
def clean(self):
. . .
然后您将无法获得所需的字段错误,并且可以根据需要覆盖验证。