在烧瓶中的不同wtfform中使用相同的变量名

时间:2019-06-13 07:05:27

标签: variables wtforms

在我的Flask应用程序中,我实现了2个包含相同变量名的新表单。两种形式都使用相同的POST请求提交。由于性别数据显示为出生日期,因此结果令人困惑。

class Date_of_birth(Form):
    field_1 = DateField("Date of Birth", format="%Y-%m-%d")


class Gender(Form):
    field_1 = SelectField("Gender", choices=[("Male", "Male"), ("Female", "Female")])

当我将变量名分别更改为“ field_1”和“ field_2”时,它们起作用了。

因此,我假设不能在单个POST请求中提交包含相同变量名的多个WTF,但是它们必须具有不同的变量名? 如果是这样,为什么?

1 个答案:

答案 0 :(得分:0)

当网络浏览器将HTML表单数据回传到服务器时,它看起来像这样:

field_1=2000-01-01&field_1=Female

数据仅包含字段名称及其对应的值,因此,如果存在多个字段名称冲突的服务器,服务器将无法确定将哪个名称/值对分配给哪种格式。因此,您需要在html中使用不同的字段名称,以确保服务器可以在POST上为正确的表单分配正确的值。

但是wtforms提供了解决此问题的方法。 form class接受前缀参数:

  

前缀 –如果提供,则所有字段的名称都将带有前缀

因此您可以像这样实例化表单:

dob = Date_of_birth(前缀=“ dob”) 性别=性别(前缀='性别')

输入元素HTML将包含前缀:

<input id="dob-field_1" name="dob-field_1" type="text" value="">

,POST数据也将如此:

dob-field_1=2000-01-01&gender-field_1=Female

和wtforms将基于前缀自动提取正确的值:

>>> # Post data is usually in a MultiDict - a kind of dict that can have
>>> multiple values for a single key.

>>> data = MultiDict([('dob-field_1', '2000-01-01'), ('gender-field_1', 'Female')])
>>> dob = Date_of_birth(data, prefix='dob')  
>>> dob.validate()
True
>>> dob.data
{'field_1': datetime.date(2000, 1, 1)}


>>> gender = Gender(data, prefix='gender')
>>> gender.validate()
True
>>> gender.data
{'field_1': 'Female'}