将值传递给不是来自Django ModelForm输入的必填字段

时间:2015-04-17 20:14:37

标签: python django django-forms

我有一个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

2 个答案:

答案 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):
        . . .

然后您将无法获得所需的字段错误,并且可以根据需要覆盖验证。