Jinja2将整个元素放入<option>中

1 投票
3 回答
9624 浏览
提问于 2025-04-20 01:40

我需要动态选择以下内容:

这样我就可以根据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> 选项。

撰写回答