我正在使用 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
。 forms.IntegerField
的min_value
参数呢?
您覆盖字段的
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
正确的做法是:
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的数字。
我不这么认为,但您可以在检查之前检查指定字段的长度
if form.is_valid():
。喜欢:if len(form.cleaned_data['field']) < min: