将值传递给不是来自 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 方法?

如何将值从Django模板传递给View

将值传递给来自python的livy

如何将值从 javascript 函数传递到 django 视图

如何将值从 html 传递到 django 中查看?

如何将值从 django 模板化 html 传递到 ajax