python wtform

发布时间 2023-06-11 20:51:00作者: 圆或非

1、使用wtform报错TypeError: object of type 'int' has no len()

这个错误通常是因为在表单定义中使用了整数类型的字段,而wtform期望的是字符串类型的字段。

例如,如果你定义了一个整数类型的字段:

python
from wtforms import Form, IntegerField

class MyForm(Form):
    age = IntegerField('Age')
然后在使用表单的时候给这个字段传递了一个整数值:

python
form = MyForm(age=25)
这时就会报错,因为wtform期望的是一个字符串类型的值。

要解决这个问题,可以将字段类型改为字符串类型:

python
from wtforms import Form, StringField

class MyForm(Form):
    age = StringField('Age')
然后在使用表单的时候给这个字段传递一个字符串值:

python
form = MyForm(age='25')
这样就不会再出现上面的错误了。

2、整数类型

如果接口中需要传整数,可以在定义表单的时候使用IntegerField类型。例如:

python
from wtforms import Form, IntegerField

class MyForm(Form):
    age = IntegerField('Age')
然后在使用表单的时候给这个字段传递一个整数值:

python
form = MyForm(age=25)
这样就可以正确地传递整数值了。如果传递的值不是整数类型,wtform会自动将其转换为整数类型。如果无法转换,会抛出ValueError异常。

2.1、限制整数范围

如果需要限制整数的范围,可以使用IntegerField的validators参数。validators参数可以传递一个验证器列表,其中包含了各种验证器,用于验证字段的值是否符合要求。下面是一个例子:

python
from wtforms import Form, IntegerField, validators

class MyForm(Form):
    age = IntegerField('Age', validators=[validators.NumberRange(min=18, max=60)])
上面的代码中,使用了NumberRange验证器,用于限制age字段的范围在18到60之间。如果传递的值不在这个范围内,wtform会抛出ValidationError异常。可以在表单的validate方法中捕获这个异常,然后根据需要处理它。

python
form = MyForm(age=17)
if form.validate():
    # 处理表单数据
else:
    # 处理验证失败的情况
    print(form.errors)

上面的代码中,如果传递的age值小于18,会导致表单验证失败,然后在form.errors中包含了错误信息。可以根据需要处理这些错误信息,例如将它们显示给用户。

3、forbidden = BooleanField('forbidden'),BooleanField获取的数据不是bool值,如何或者bool值

在默认情况下,BooleanField获取的数据类型是字符串类型,而不是bool类型。这是因为在HTML表单中,复选框的值通常是字符串类型,例如"on"或者空字符串""。wtform会自动将这些字符串转换为bool类型,但是需要在表单定义中使用BooleanField的coerce参数来启用这个功能。例如:

python
from wtforms import Form, BooleanField

class MyForm(Form):
    forbidden = BooleanField('forbidden', coerce=bool)
上面的代码中,使用了BooleanField的coerce参数,将获取的值强制转换为bool类型。这样就可以正确地获取和处理复选框的值了。

另外,如果需要将复选框的值转换为其他类型,也可以使用自定义的转换函数,例如:

python
from wtforms import Form, BooleanField
from wtforms.validators import InputRequired

def str_to_int(value):
    if value == 'on':
        return 1
    else:
        return 0

class MyForm(Form):
    forbidden = BooleanField('forbidden', validators=[InputRequired()], coerce=str_to_int)
上面的代码中,定义了一个str_to_int函数,用于将复选框的值转换为整数类型。然后在表单定义中使用了这个函数,并添加了InputRequired验证器,表示这个字段是必填的。这样就可以获取和处理复选框的值了。

4、获取wtform参数值

在使用wtform处理表单数据时,可以使用它的data属性获取传入的参数值。例如:

python
from flask import request
from wtforms import Form, StringField

class MyForm(Form):
    name = StringField('Name')

form = MyForm(request.form)
if form.validate():
    name = form.name.data
    # 处理表单数据
else:
    # 处理验证失败的情况
    print(form.errors)
上面的代码中,使用request.form获取传入的表单数据,并使用MyForm处理这些数据。如果表单验证通过,可以使用form.name.data获取name字段的值。如果需要获取其他字段的值,可以使用类似的方式。

需要注意的是,如果表单数据中没有传递某个字段的值,那么使用data属性获取这个字段的值会返回None。如果需要在获取字段的值时进行默认值的设置,可以使用Field的default参数。例如:

python
from wtforms import Form, StringField

class MyForm(Form):
    name = StringField('Name', default='')

form = MyForm(request.form)
name = form.name.data or ''
# 处理表单数据
上面的代码中,使用StringField的default参数将name字段的默认值设置为''。然后在获取name字段的值时,使用or运算符将其转换为字符串类型,并设置默认值为''。这样就可以避免在获取字段值时出现None的情况。

5、传入的表单数据如何转换成字典或者列表


将表单数据转换为字典:

python
from flask import request
from wtforms import Form, StringField

class MyForm(Form):
    name = StringField('Name')

form = MyForm(request.form)
if form.validate():
    data = {field.name: field.data for field in form}
    # 处理表单数据**
else:
    # 处理验证失败的情况
    print(form.errors)
上面的代码中,使用form的迭代器获取所有的字段,然后将字段的name和data属性分别作为字典的键和值,最终得到一个字典类型的表单数据。如果需要获取其他字段的值,可以使用类似的方式。

将表单数据转换为列表:

python
from flask import request
from wtforms import Form, StringField

class MyForm(Form):
    name = StringField('Name')

form = MyForm(request.form)
if form.validate():
    data = [field.data for field in form]
    # 处理表单数据**
else:
    # 处理验证失败的情况
    print(form.errors)
上面的代码中,使用form的迭代器获取所有的字段,然后将字段的data属性作为列表的元素,最终得到一个列表类型的表单数据。如果需要获取其他字段的值,可以使用类似的方式。

需要注意的是,如果表单数据中没有传递某个字段的值,那么使用data属性获取这个字段的值会返回None。如果需要在获取字段的值时进行默认值的设置,可以使用Field的default参数。例如:

python
from wtforms import Form, StringField

class MyForm(Form):
    name = StringField('Name', default='')

form = MyForm(request.form)
data = [field.data or '' for field in form]
# 处理表单数据
上面的代码中,使用StringField的default参数将name字段的默认值设置为''。然后在获取name字段的值时,使用or运算符将其转换为字符串类型,并设置默认值为''。这样就可以避免在获取字段值时出现None的情况。```


**如果传进啦是个list,如何对list下的参数进行验证**

如果传进来的是一个列表,而不是一个表单对象,可以使用wtforms的FieldList和FormField来对列表中的每个元素进行验证。FieldList用于表示一个字段的列表,FormField用于表示一个嵌套的表单对象。例如:

python
from wtforms import Form, StringField, FieldList, FormField, validators

class ItemForm(Form):
name = StringField('Name', validators=[validators.InputRequired()])
price = StringField('Price', validators=[validators.InputRequired()])

class MyForm(Form):
items = FieldList(FormField(ItemForm))

data = {'items': [{'name': 'item1', 'price': '10'}, {'name': 'item2'}]}
form = MyForm(data=data)
if form.validate():
items = form.items.data
# 处理表单数据
else:
# 处理验证失败的情况
print(form.errors)
上面的代码中,定义了一个ItemForm用于表示一个商品的信息,包括名称和价格。然后定义了一个MyForm用于表示商品列表。在MyForm中使用了FieldList和FormField来表示一个商品的信息。在表单验证时,可以使用form.items.data获取商品列表的数据。

需要注意的是,如果列表中的某个元素验证失败,那么整个表单也会验证失败。如果需要在验证失败时返回每个元素的错误信息,可以使用Form的process方法,例如:

python
from wtforms import Form, StringField, FieldList, FormField, validators

class ItemForm(Form):
name = StringField('Name', validators=[validators.InputRequired()])
price = StringField('Price', validators=[validators.InputRequired()])

class MyForm(Form):
items = FieldList(FormField(ItemForm))

data = {'items': [{'name': 'item1', 'price': '10'}, {'name': 'item2'}]}
form = MyForm(data=data)
if form.validate():
items = form.items.data
# 处理表单数据
else:
# 处理验证失败的情况
errors = []
for index, field in enumerate(form.items):
if not field.validate():
errors.append((index, field.errors))
print(errors)
上面的代码中,在表单验证失败时,使用了Form的process方法遍历每个元素,获取其验证结果和错误信息。然后将每个元素的索引和错误信息添加到一个列表中,最终返回这个列表。这样就可以在验证失败时返回每个元素的错误信息了。



**TypeError: formdata should be a multidict-type wrapper that supports the 'getlist' method**

这个错误通常是由于在实例化表单对象时,传递了一个不支持getlist方法的formdata参数。getlist方法用于获取表单字段的多个值,如果formdata参数不支持getlist方法,则无法正确解析表单数据。

例如,下面的代码中,使用了request.form作为formdata参数,但是request.form不支持getlist方法,因此会抛出TypeError异常:

python
from flask import request
from wtforms import Form, StringField, validators

class MyForm(Form):
name = StringField('Name', validators=[validators.DataRequired()])

form = MyForm(request.form)
要解决这个问题,可以使用MultiDict类作为formdata参数,MultiDict类是一个支持getlist方法的字典类型。例如,下面的代码中,使用了request.form.to_dict(flat=False)方法将request.form转换为MultiDict类型,并作为formdata参数传递给了MyForm类:

python
from flask import request
from werkzeug.datastructures import MultiDict
from wtforms import Form, StringField, validators

class MyForm(Form):
name = StringField('Name', validators=[validators.DataRequired()])

formdata = MultiDict(request.form.to_dict(flat=False))
form = MyForm(formdata=formdata)
上面的代码中,使用了request.form.to_dict(flat=False)方法将request.form转换为MultiDict类型,并将MultiDict对象作为formdata参数传递给了MyForm类。这样就可以正确解析表单数据了。


**传入的是request.json,该如何处理**

如果传入的是JSON格式的数据,可以使用request.get_json()方法将JSON数据转换为Python对象,然后将Python对象作为表单数据传递给WTForms表单对象进行验证。

例如,假设传入的JSON数据格式如下:

json
{
"name": "John",
"email": "john@example.com"
}
可以使用以下代码将JSON数据转换为Python对象,并将Python对象作为表单数据传递给WTForms表单对象进行验证:

python
from flask import request
from wtforms import Form, StringField, validators

class MyForm(Form):
name = StringField('Name', validators=[validators.DataRequired()])
email = StringField('Email', validators=[validators.Email()])

data = request.get_json()
form = MyForm(data=data)
if form.validate():
# 处理表单数据
else:
# 处理验证失败的情况
print(form.errors)
上面的代码中,使用request.get_json()方法将JSON数据转换为Python对象,然后将Python对象作为表单数据传递给MyForm类。在表单验证时,可以使用form.validate()方法进行验证,如果验证通过,则处理表单数据,否则处理验证失败的情况。

需要注意的是,如果JSON数据中包含了列表类型的数据,需要将列表数据转换为Python列表对象,然后将Python列表对象作为表单数据传递给WTForms表单对象进行验证。例如:

json
{
"items": [
{"name": "item1", "price": "10"},
{"name": "item2", "price": "20"}
]
}
可以使用以下代码将JSON数据转换为Python对象,并将Python对象作为表单数据传递给WTForms表单对象进行验证:

python
from flask import request
from wtforms import Form, StringField, FieldList, FormField, validators

class ItemForm(Form):
name = StringField('Name', validators=[validators.InputRequired()])
price = StringField('Price', validators=[validators.InputRequired()])

class MyForm(Form):
items = FieldList(FormField(ItemForm))

data = request.get_json()
data['items'] = [dict(item) for item in data.get('items', [])]
form = MyForm(data=data)
if form.validate():
items = form.items.data
# 处理表单数据
else:
# 处理验证失败的情况
print(form.errors)
上面的代码中,定义了一个ItemForm用于表示一个商品的信息,包括名称和价格。然后定义了一个MyForm用于表示商品列表。在MyForm中使用了FieldList和FormField来表示一个商品的信息。在表单验证时,使用了dict(item)将列表中的每个元素转换为Python字典对象,然后将Python字典对象作为表单数据传递给MyForm类。在处理表单数据时,可以使用form.items.data获取商品列表的数据。


**传入的数据是body数据**
如果传入的数据是body数据,可以使用request.data获取原始的二进制数据,然后将二进制数据解码为字符串,再使用json.loads()方法将JSON字符串转换为Python对象。最后,将Python对象作为表单数据传递给WTForms表单对象进行验证。

例如,假设传入的body数据格式如下:

json
{
    "name": "John",
    "email": "john@example.com"
}
可以使用以下代码将body数据转换为Python对象,并将Python对象作为表单数据传递给WTForms表单对象进行验证:

python
import json
from flask import request
from wtforms import Form, StringField, validators

class MyForm(Form):
    name = StringField('Name', validators=[validators.DataRequired()])
    email = StringField('Email', validators=[validators.Email()])

data = json.loads(request.data.decode('utf-8'))
form = MyForm(data=data)
if form.validate():
    # 处理表单数据
else:
    # 处理验证失败的情况
    print(form.errors)
上面的代码中,使用request.data获取原始的二进制数据,然后使用decode()方法将二进制数据解码为字符串。接着,使用json.loads()方法将JSON字符串转换为Python对象,然后将Python对象作为表单数据传递给MyForm类。在表单验证时,可以使用form.validate()方法进行验证,如果验证通过,则处理表单数据,否则处理验证失败的情况。

需要注意的是,如果JSON数据中包含了列表类型的数据,需要将列表数据转换为Python列表对象,然后将Python列表对象作为表单数据传递给WTForms表单对象进行验证。例如:

json
{
    "items": [
        {"name": "item1", "price": "10"},
        {"name": "item2", "price": "20"}
    ]
}
可以使用以下代码将body数据转换为Python对象,并将Python对象作为表单数据传递给WTForms表单对象进行验证:

python
import json
from flask import request
from wtforms import Form, StringField, FieldList, FormField, validators

class ItemForm(Form):
    name = StringField('Name', validators=[validators.InputRequired()])
    price = StringField('Price', validators=[validators.InputRequired()])

class MyForm(Form):
    items = FieldList(FormField(ItemForm))

data = json.loads(request.data.decode('utf-8'))
data['items'] = [dict(item) for item in data.get('items', [])]
form = MyForm(data=data)
if form.validate():
    items = form.items.data
    # 处理表单数据
else:
    # 处理验证失败的情况
    print(form.errors)
上面的代码中,定义了一个ItemForm用于表示一个商品的信息,包括名称和价格。然后定义了一个MyForm用于表示商品列表。在MyForm中使用了FieldList和FormField来表示一个商品的信息。在表单验证时,使用了dict(item)将列表中的每个元素转换为Python字典对象,然后将Python字典对象作为表单数据传递给MyForm类。在处理表单数据时,可以使用form.items.data获取商品列表的数据。

AI - 19:31:23
-此内容由AI生成
TypeError: object of type 'int' has no len()

- 19:56:50
这个错误通常是由于在表单验证时,将一个整数类型的值传递给了WTForms表单对象所期望的字符串类型的字段。因为WTForms表单对象期望的字段类型是字符串,所以在验证时,会尝试调用字符串的len()方法获取字段的长度,但是整数类型的值没有len()方法,所以会抛出TypeError异常。

例如,下面的代码中,定义了一个包含字符串类型的字段的表单类,然后将一个整数类型的值传递给了该字段:

python
from wtforms import Form, StringField, validators

class MyForm(Form):
    name = StringField('Name', validators=[validators.DataRequired()])

form = MyForm()
form.name.data = 123  # 整数类型的值
if form.validate():
    # 处理表单数据
else:
    # 处理验证失败的情况
    print(form.errors)
在上面的代码中,将整数类型的值123赋值给了表单类中的name字段。在表单验证时,由于name字段期望的值是字符串类型,但是实际上传递了一个整数类型的值,所以会抛出TypeError异常。

要解决这个问题,需要将整数类型的值转换为字符串类型的值,然后再将其赋值给表单类中的字段。例如,可以使用str()函数将整数类型的值转换为字符串类型的值:

python
from wtforms import Form, StringField, validators

class MyForm(Form):
    name = StringField('Name', validators=[validators.DataRequired()])

form = MyForm()
form.name.data = str(123)  # 字符串类型的值
if form.validate():
    # 处理表单数据
else:
    # 处理验证失败的情况
    print(form.errors)
上面的代码中,使用str()函数将整数类型的值123转换为字符串类型的值,然后将其赋值给表单类中的name字段。在表单验证时,由于name字段期望的值是字符串类型,而实际上传递了一个字符串类型的值,所以不会抛出TypeError异常。