将值传递给不是来自 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 中的输入的必填字段的主要内容,如果未能解决你的问题,请参考以下文章