我有几个字段的ModelForm。有些字段是必需的,有些则不是。此外,我选择了具有不同选择的字段,并且我希望根据此选择字段选项使某些字段“必需”。
我在Form
的clean()方法中尝试过def clean(self):
cleaned_data = self.cleaned_data
some_field = cleaned_data.get("some_field")
if some_field == 'some_value':
self.fields['other_field'].required = False
return cleaned_data
但它不起作用
答案 0 :(得分:10)
请参阅Cleaning and validating fields that depend on each other上的Django文档。标准做法是执行以下处理:
def clean(self):
cleaned_data = self.cleaned_data
some_field = cleaned_data.get("some_field")
if some_field == 'some_value':
# 'other_field' is conditionally required.
if not cleaned_data['other_field']:
raise forms.ValidationError("'Other_field' is required.")
return cleaned_data
答案 1 :(得分:2)
您有正确的想法,但问题是在表单清理之前已经运行了各个字段验证。你有几个选择。您可以使该字段不是必需的,并在form.clean
中处理所需的逻辑。或者您可以根据需要离开该字段并删除它可能在清理中引发的验证错误。
def clean(self):
cleaned_data = self.cleaned_data
some_field = cleaned_data.get("some_field")
if some_field == 'some_value':
if 'other_field' in self.errors:
del self.errors['other_field']
cleaned_data['other_field'] = None
return cleaned_data
这有一些问题,因为它会删除所有错误,而不仅仅是缺失/必需的错误。 cleaned_data
也存在问题。您现在有一个必填字段,该字段不在cleaning_data中,这就是我将其添加为None
的原因。您的应用程序的其余部分将必须处理此案例。拥有一个没有值的必填字段似乎很奇怪。
答案 2 :(得分:2)
如果您想以常用方式打印所需字段的错误消息,可以执行以下操作:
def clean(self):
cleaned_data = super(PasswordChangeForm, self).clean()
token = cleaned_data.get('token')
old_password = cleaned_data.get('old_password')
if not token and not old_password:
self._errors['old_password'] = self.error_class([self.fields['old_password'].error_messages['required']])