问题描述
我有一个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}}。