我有一个表单来处理产品的添加和修改。 在添加产品时,我想从验证中排除 modifyAttribute 字段,当我修改产品时,我想从验证中排除 addAttribute 字段。
当我输入 addAttribute 字段的值时,我处于“添加模式”,当我输入 modifyAttribute 字段的值时,我处于“修改模式”(文本框) )。
怎么做?哪里?在视图中?形成?
答案 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用于修改字段。在我看来,我总是一次调用两个表单,只需要验证那两个表单。