在我的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,但是它们必须具有不同的变量名? 如果是这样,为什么?
答案 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'}