ModelForm 的字段取决于用户权限?

问题描述 投票:0回答:1

我有一个模型

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)

你会如何解决这个问题?

django django-models django-forms
1个回答
0
投票

您也可以将其添加为验证器:

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

 [Django-doc],因为这会更改跨越此表单中所有实际字段的“父级”。因此,这意味着如果您在某个时刻使用 enable_limit
,它将从现在开始将验证器添加到此后创建的 
all AddressForm

© www.soinside.com 2019 - 2024. All rights reserved.