Jinja2将整个元素放入<option>中
我需要动态选择以下内容:
这样我就可以根据POST
请求来显示选中的元素。
我想把selected="selected"
变成一个模板,这样我就可以选择放在哪里。
<select name="my_name">
<option value="5min">5-Min</option>
<option value="1hour" selected="selected">Hour</option>
<option value="1day">Day</option>
</select>
3 个回答
0
我不太清楚你提问的背景是什么。如果你是因为需要一些自定义功能而不能使用 wtf.quick_form(yourform)
,那么你可以简单地在你的 Jinja2 模板中使用
{{ form.workers.__call__(**{'class': 'form-control'}) }}
来处理相应的字段。这段代码会选择表单中提交的元素。注意我如何定义了额外的属性(比如一个类)。
结果会是(例如):
<select class="form-control" id="worker" name="worker">
<option value="0">text1</option>
<option selected value="1">text2</option>
<option value="2">text3</option>
</select>
当然,这要求你有一个正确定义的表单:
class yourform(FlaskForm):
workers = SelectField(
'name',
validators=[Required()],
choices=[(0, 'text1'), (1, 'text2'), (2, 'text3')],
coerce=int
)
(... whatever other fields here ...)
0
我用和Pawel一样的方法,只是做了一些小改动,以便能和我现在使用的Jinja2版本兼容:
<select class="form-control" id="worker" name="worker">
{% for key in workers %}
<option value="{{key}}" {% if key == people.worker %} selected="selected" {% endif %}>
{{key}}
</option>
{% endfor %}
</select>
然后是控制器的部分:
workers = {'First One','Second One', 'Third One'}
return render_template('edit.html', people=people, workers=workers)
记得把控制器的代码放在负责传递数据给视图的控制器里哦。
4
假设 target
是你想要选择的目标值(这个值是从POST字典中获取的)。
那么你需要做两件事:
准备一个字典,这个字典里包含所有选项的值和显示文本的配对,比如:
mydict = {'5min': '5-Min', '1hour': 'Hour', '1day': 'Day'}
在 yourtemplate.html
文件中:
<select name="my_name">
{% for key, value in mydict.items() %}
<option value="{{key}}"
{% if (key == target) %} selected="selected" { %endif %}
>
{{value}}
</option>
{% endfor %}
</select>
如何传递 target
- 在你的视图中你需要这样做(我假设你对Flask中的视图有基本了解)。
target = request.form['key_of_the_data_we_need'] # the value that should be selected
mydict = {'5min': '5-Min', '1hour': 'Hour', '1day': 'Day'} # helper for the select
return render_template('yourtemplate.html', target=target, mydict=mydict)
这样,数据就会发送到 yourtemplate.html,这个文件里包含了上面讨论的代码,从而可以选择到你想要的 <select>
选项。