ModelForm类的双重继承,不能更改必填字段

问题描述

我有一个ModelForm类,该类用作所有其他表单类的父级。看起来像这样:

class BootstrapForm(forms.ModelForm):
    def __init__(self,*args,**kwargs):
        super(BootstrapForm,self).__init__(*args,**kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs['class'] = 'form-control text-center'
            if field != 'email':
                self.fields[field].widget.attrs['class'] += ' text-capitalize'

        for error in self.errors:
            if error in self.fields:
                self.fields[error].widget.attrs['class'] += ' is-invalid'

我也有一个模型,该模型的字段'tax_no'的空白设置为True:

class Institution(CustomModel):
    name = models.CharField(max_length=256,null=False,blank=False,verbose_name=_('nazwa'))
    address = models.ForeignKey('Address',on_delete=models.PROTECT,verbose_name=_('adres'))
    phone = PhoneNumberField(null=True,blank=True,verbose_name=_('telefon'))
    tax_no = models.CharField(max_length=15,null=True,validators=[validate_tax_number,],verbose_name=_('NIP'))

我想要的是一个认情况下允许空的tax_no字段的模型,但我希望可以根据需要将其设置为必填。 我的问题是,当我尝试将字段设置为必填时,例如:

class InvoiceInstitutionForm(BootstrapForm):
    class Meta:
        model = Institution
        exclude = ('address',)

    def __init__(self,**kwargs):
        super(InvoiceInstitutionForm,**kwargs)
        print(self.fields['tax_no'].required)
        self.fields['tax_no'].required = True

仅当InvoiceInstitutionForm直接从form.ModelForm继承时,它才能正常工作。从BootsrapForm类继承后,它不起作用。 奇怪的是,它会正确生成html字段:

<input type="text" name="invoice-tax_no" maxlength="15" class="form-control text-center text-capitalize" required="" id="id_invoice-tax_no">

但是在验证时它并不关心这一点。即使tax_no为空也可以有效。 有什么想法为什么不起作用以及如何解决

解决方法

当您执行for error in self.errors:时,访问self.errors会使表单得到验证。当您致电super(InvoiceInstitutionForm,self).__init__(*args,**kwargs)时会发生这种情况。

在下一行设置required = True时,为时已晚,因为该表单已经过验证。

我最初建议您可以使用error_css_class选项,而不要遍历self.errors,但是正如您在评论中所说,只有在使用{{ form.as_p }},{ {1}}。