如何动态定义forms.IntegerField的min_value参数?

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

我正在使用 Django 及其 Forms 类。

我创建了一个带有单个

forms.IntegerField
的表单,我想动态定义它的
min_value
参数:

class BiddingForm(forms.Form):
    bidding_form = forms.IntegerField(min_value=1, help_text="€", label="Bid")

现在,它静态设置为

1
。我尝试覆盖
__init__()
函数并在其中传递
min_value
。但由于
bidding_form
是一个类变量,我无法在其上使用生成的实例变量
min_value
:

class BiddingForm(forms.Form):
    min_value = 1

    def __init__(self, min_value):
        super().__init__()
        self.min_value = min_value

    bidding_form = forms.IntegerField(min_value=min_value, help_text="€", label="Bid")

据我了解,上面的类在

min_value
内部创建了一个实例变量
__init__()
,它只是隐藏了类变量
min_value
,最终导致
min_value
1
的声明中成为
bidding_form

由于我对Python和Django了解甚少,所以我还没有找到解决方案。
那么,如何动态定义
forms.IntegerField
min_value
参数呢?

python django django-forms
3个回答
2
投票

您覆盖字段的

min_value

from django.core import validators MinValueValidator

class BiddingForm(forms.Form):
    bidding_form = forms.IntegerField(help_text='€', label='Bid')

    def __init__(self, *args, min_value=None, **kwargs):
        super().__init__(self, *args, **kwargs)
        bidding_form = self.fields['bidding_form']
        bidding_form.min_value = min_value
        if min_value is not None:
            bidding_form.validators.append(MinValueValidator(min_value))
            bidding_form.widget.attrs['min'] = min_value


0
投票

正确的做法是:

class BidForm(forms.Form):
    bid = forms.IntegerField()

    def __init__(self, min_bid_value=0, *args, **kwargs):
        super(BidForm, self).__init__(*args, **kwargs)
        self.fields['bid'].widget.attrs['min'] = min_bid_value

你可以这样称呼它:

BidForm(min_bid_value=145)

并且表单不允许用户输入小于小于145的数字。


-1
投票

我不这么认为,但您可以在检查之前检查指定字段的长度

if form.is_valid():
。喜欢:
if len(form.cleaned_data['field']) < min:

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