如何在WTForms中使用HiddenField强制整数数据?

7 投票
2 回答
4160 浏览
提问于 2025-04-18 07:11

我有一个叫做 WTForm 的类,内容如下:

class MyForm(Form):
    field1 = HiddenField(default=0, validators=NumberRange(min=0, max=20)])

把这个标记看作是 WTForms 渲染出来的结果。

<input type='hidden' name='field1' value='5'></input>

这个内容没有通过 NumberRange 的验证。原因是 HiddenField 的小部件类把 value 属性转换成了字符串。那么我该怎么做才能让 WTForms 生成这样的标记,以便我可以在后续的 POST 请求中进行数字验证呢?

2 个回答

-6

你可以使用自定义的验证器。

https://docs.djangoproject.com/en/dev/ref/validators/

from django.core.exceptions import ValidationError

def validate_max(value, **kwargs):   
    min = kwargs.get('min', 0)
    max = kwargs.get('max', 10)
    if str(value).isnum() and int(value) > max:
        raise ValidationError('%s is not in the range [%s..%s]' % (value, min, max))

或者为字段 field1 声明一个叫做 clean 的方法。

def clean_field1(self):
    value = self.cleaned_data['field1']
    try:
       ...
    except:
       raise ValidationError(...)
    return value
19

推荐的做法是使用一个 IntegerField,然后把它的显示方式改成 HiddenInput,也就是隐藏输入框。

class MyForm(Form):
    field1 = IntegerField(widget=HiddenInput())

你还可以通过继承来创建自己的类。

class HiddenInteger(IntegerField):
    widget = HiddenInput()

撰写回答