Django modelform根据其他字段选择删除“required”属性

时间:2011-08-17 12:10:53

标签: django django-forms django-models

我有几个字段的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

但它不起作用

3 个答案:

答案 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']])