django:动态排除验证字段

时间:2013-07-19 13:25:37

标签: django forms validation dynamic

我有一个表单来处理产品的添加和修改。 在添加产品时,我想从验证中排除 modifyAttribute 字段,当我修改产品时,我想从验证中排除 addAttribute 字段。

当我输入 addAttribute 字段的值时,我处于“添加模式”,当我输入 modifyAttribute 字段的值时,我处于“修改模式”(文本框) )。

怎么做?哪里?在视图中?形成?

3 个答案:

答案 0 :(得分:0)

我建议您覆盖表单的clean()方法,因为您需要一次访问多个字段。 向字段添加验证更容易,因为您可以从对象的self.cleaned_data字典中访问清理的值,因此我建议您将两个字段都传递给然后根据具体情况提出异常/修改数据。相关文档为here

示例:

class YourForm(forms.Form):
    # Everything as before.
    ...

    def clean(self):
        cleaned_data = super(YourForm, self).clean()
        add_attribute = cleaned_data.get("add_attribute")
        modify_attribute = cleaned_data.get("modify_attribute")

        if modify_attribute and add_attribute:
            raise forms.ValidationError("You can't add and
                                     modify a product at the same   time.")

        if not modify_attribue and not add_attribute:
            raise forms.ValidationError("You must either add or modify a product.")
         # Always return the full collection of cleaned data.
        return cleaned_data

然后在你的视图中,你可以做一件事,如果是modify_attribute而另一件是add_attribute,因为现在你知道只有其中一件存在。

答案 1 :(得分:0)

您可以使用__init__形式删除字段,ModelForm看起来像这样:

class AddModifyForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(AddModifyForm, self).__init__(*args, **kwargs)
        if self.instance.pk:
            del self.fields['modifyAttribute']
        else:
            del self.fields['addAttribute']

    class Meta:
        model = YourModel
        fields = ['addAttribute', 'modifyAttribute', ...]

答案 2 :(得分:0)

它可能不是完美的解决方案,但我最终设计了3种形式:1用于公共字段,1用于添加字段,1用于修改字段。在我看来,我总是一次调用两个表单,只需要验证那两个表单。