在is_valid中设置为必需后,如何确保表单字段不需要?

时间:2018-01-15 12:58:54

标签: django django-forms

我有一个表单,我将description设置为不需要。

class LeaveApprovalForm(forms.ModelForm):
    class Meta:
        model = LeaveRequest

    description = forms.CharField(
        widget=forms.Textarea,
        label='Reason',
        required=False
    )

    def is_valid(self):
        '''A description is not required when approving'''
        self.fields['description'].required = False
        if self.data.get('reject', None):
            self.fields['description'].required = True
        return super().is_valid()

但是,在验证表单并显示This field is required.错误时。 html具有required属性,因此如果它没有被拒绝并被批准,则触发需要数据输入的jquery弹出窗口。

如何确保formis再次初始化时不需要?

1 个答案:

答案 0 :(得分:2)

首先,您不应该覆盖is_valid。要覆盖的正确方法称为clean()

其次,您不应修改字段的所需状态。相反,在clean()方法中,检查所需的组合并在必要时引发验证错误。

def clean(self):
    if self.data.get('reject') and not self.data.get('description'):
        raise forms.ValidationError('Description is required if data is supplied')
        # or
        self.add_error('description', '....')