将值传递给不是来自 Django ModelForm 中的输入的必填字段
Posted
技术标签:
【中文标题】将值传递给不是来自 Django ModelForm 中的输入的必填字段【英文标题】:Passing values to required fields that do not come from inputs in Django ModelForm 【发布时间】:2015-06-24 20:34:44 【问题描述】:我有一个 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
当我打印 clean_data 时,我可以在终端中看到这些值。但是,当我在页面上显示错误消息时,它告诉我 display_from 和 display_to 是必需的。
也许这不应该在 clean() 方法中完成?
我也尝试使用空的隐藏输入,但没有成功。有什么想法吗?
编辑:
排除字段没有帮助,它返回一个 IntegrityError 消息:
null value in column "display_from" violates not-null constraint
【问题讨论】:
您是否排除了元数据中的字段? 【参考方案1】:请记住,clean() 函数在模型上每个字段的各种 clean_ 函数之后调用(文档 here)。
因此,那些单独的字段清理函数将引发 ValidationErrors,在您的 clean() 函数进入之前将其固定到 form.errors 字典并将默认值添加到 clean_data 字典。
您也可以继续使用您已经开始使用的方法。只需从错误字典中删除错误即可。
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")
【讨论】:
【参考方案2】:您需要将这些字段添加到您的 exclude
元组中:
class YourForm(forms.ModelForm):
class Meta:
exclude = ('display_from', 'display_to',)
model = YourModel
def clean(self):
. . .
那么您将不会收到必填字段错误,并且可以根据需要覆盖验证。
【讨论】:
它给了我一个错误信息,我已经尝试过了:null value in column "display_from" violates not-null constraint
可能是因为排除的字段没有保存在模型实例中?在clean
中尝试像这样设置它们:self.instance.display_from = "value here"
(当然还有self.cleaned_data['display_from'] = self.instance.display_from
)
我发现这通常是行不通的,因为模型字段为空白=假。
好吧,当然,如果您要覆盖验证并排除它们,则必须设置字段值。如果您正在执行一些自定义覆盖并自己对值负责,则将字段设置为 blank=True
并没有什么害处。我不确定在不排除这些值的情况下,您还能如何执行 O.P. 的要求。以上是关于将值传递给不是来自 Django ModelForm 中的输入的必填字段的主要内容,如果未能解决你的问题,请参考以下文章
如何从视图将值传递给 Django Form init 方法?