我有一个用 Flask 和 WTFforms 制作的表单中的
SelectField
。
SelectField
是通过字典中的选项创建的,{label:list}
。
问题是:因为在该字典中的某些列表中存在相同的字符串,所以我需要一种方法来访问用户选择所属的标签。
以下是我的flask应用程序的views.py中的配对版本,不包含功能所需的一些内容。
from userClass import UserForm
@ bp.route('/', methods['GET', 'POST'])
def index():
# initializing the form
form1 = UserForm()
# if selectProfile clicked
if form1.selectProfile.data and form1.validate():
data = form1.displayUserAge.data
return data
以下内容来自我的form.py。
userAge = {"Male": ["19-30y", "31-50y"], "Female": ["19-30y", "31-50y"]}
class UserForm(FlaskForm):
displayUserAge = SelectField(u"Age", choices = userAge)
这是使用 Jinjia 的 index.html 中的相关部分:
{{ form1.hidden_tag() }}
{{ form1.displayUserAge.label }}
{{ form1.displayUserAge }}
{{ form1.selectProfile }}
使用
form1.displayUserAge.data
返回(例如)“19-30y”,但不指示用户选择男性还是女性。
使用
form1.displayUserAge.choices
返回所有选择,但显然不表明用户选择了什么。
一个技巧可能是让选择更详细,并制作一个选择列表而不是字典,即 [“男性 19-30 岁”,“男性 31-50 岁”,“女性 19-30 岁”,“女性 31-50 岁” ”]。但这使下拉菜单变得混乱。
<optgroup>
元素,其标签无法通过表单对象访问。
<option>
元素使用两个参数,第一个参数设置 value 属性,第二个参数显示为文本。为了实现这一点,有必要在字典中分配元组列表。然后可以在用分隔符与年龄分隔的第一个值中定义性别。
class UserForm(FlaskForm):
age = SelectField(
'Age',
choices={
'': [('', 'Please select your age')],
'Female': [('f_19-30y', '19-30y'), ('f_31-50y', '31-50y')],
'Male': [('m_19-30y', '19-30y'), ('m_31-50y', '31-50y')],
},
validators=[DataRequired()]
)
@app.route('/', methods=['GET', 'POST'])
def index():
form = UserForm(request.form)
if form.validate_on_submit():
gender, age = form.age.data.split('_', 1)
print(gender, ' - ', age)
return render_template('index.html', **locals())