我有一个模型
Address
,其中包含一个字段和一个 ModelForm。
class Address(Model):
number = PositiveSmallIntegerField(default=1)
class AddressForm(ModelForm):
class Meta:
model = Address
fields = "__all__"
当表单向具有特定权限的用户显示时,如何向其添加验证器?表单的行为应该就像模型本身有一个像这样的数字字段:
number = PositiveSmallIntegerField(default=1, validators=[MaxValueValidator(100)])
我的意思是表单应该只允许 0 到 100 之间的值,并且后端应该验证该值是否在 0 到 100 之间。
视图可以通过是否使用限制字段,如下所示:
form = AddressForm(enable_limit=True)
我可以做这样的事情:
class AddressForm(ModelForm):
class Meta:
model = Address
fields = "__all__"
def __init__(self, *args, enable_limit=False, **kwargs):
if enable_limit:
self.base_fields["number"].widget.attrs["max"] = 100
但是,这只会更新小部件。该表单确实抱怨值 > 100,但这只是 HTML 表单客户端验证,通过更改请求中的值,我可以解决这个问题,但这不是我想要的。
基本上,我想告诉 ModelForm 使用
Adresse.number
字段作为基础,但还有一个额外的 MaxValueValidator(100)
。
你会如何解决这个问题?
您也可以将其添加为验证器:
from django.core.validators import MaxValueValidator
class AddressForm(ModelForm):
class Meta:
model = Address
fields = '__all__'
def __init__(self, *args, enable_limit=False, **kwargs):
if enable_limit:
self.fields['number'].validators.append(MaxValueValidator(100))
self.fields['number'].widget.attrs['max'] = 100
我不会使用.base_fields
enable_limit
,它将从现在开始将验证器添加到此后创建的all
AddressForm
。