1

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

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

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

4

3 回答 3

0

我建议您覆盖表单的clean()方法,因为您需要一次访问多个字段。向字段添加验证更容易,因为您可以从对象的字典中访问已清理的值self.cleaned_data,因此我建议您让两个字段都通过(如果存在),然后根据情况提出您认为合适的异常/修改数据。相关文档在这里

例子:

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 可以做另一件事,因为现在您知道其中只有一个存在。

于 2013-07-19T14:08:10.353 回答
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', ...]
于 2013-07-20T09:20:40.887 回答
0

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

于 2013-09-19T18:02:04.677 回答