我有一个表格来处理产品的添加和修改。添加产品时,我想从验证中排除modifyAttribute字段,当我修改产品时,我想从验证中排除addAttribute字段。
当我为addAttribute字段输入一个值时,我处于“添加模式”,当我为modifyAttribute字段(文本框)输入一个值时,我处于“修改模式” 。
怎么做?在哪里?在视图中?形式?
我有一个表格来处理产品的添加和修改。添加产品时,我想从验证中排除modifyAttribute字段,当我修改产品时,我想从验证中排除addAttribute字段。
当我为addAttribute字段输入一个值时,我处于“添加模式”,当我为modifyAttribute字段(文本框)输入一个值时,我处于“修改模式” 。
怎么做?在哪里?在视图中?形式?
我建议您覆盖表单的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 可以做另一件事,因为现在您知道其中只有一个存在。
__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', ...]
这可能不是完美的解决方案,但我最终设计了 3 种形式:一种用于公共字段,一种用于添加字段,一种用于修改字段。在我看来,我总是一次调用 2 个表单,并且只有这 2 个需要验证。