考虑一个HTML文件(名称为“ index.html”),其中包含用于创建下拉菜单的代码。此代码如下所示:
<select name = "from_length">
<option value = "choose_1" {{ select_1_1 }}>Metre</option>
<option value = "choose_2" {{ select_1_2 }} >Kilometre</option>
<option value = "choose_3" {{ select_1_3 }}>Millimetre</option>
</select>
以上代码在HTML中创建一个下拉菜单。 '{{}}'括号将由Jinja渲染,其中'select_1_1','select_1_2'或'select_1_3'之一将最终传递一个值“ selected”。也就是说,当我尝试通过Flask中的render_template渲染以上代码时,通过以下代码:
return render_template('index.html', select_1_2 = "selected")
以上代码应如下所示:
<select name = "from_length">
<option value = "choose_1">Metre</option>
<option value = "choose_2" selected >Kilometre</option>
<option value = "choose_3">Millimetre</option>
</select>
这意味着当向用户显示网页index.html时,默认情况下,用户应在下拉菜单上看到“千米”(而非“米特”,这是第一个选项)
因此,简而言之,我正在尝试向用户显示默认列表选项(即“ Metre”,“ Kilometre”或“ Millimetre”之一)。默认列表选项取决于用户的选择,因此可能有所不同。
现在,我来谈谈我的问题的pythonic部分。假设一个名为a_string
的变量存储{{select_1_1}}
,{{select_1_2}}
或{{select_1_3}}
中的变量应作为“选定”变量传递给render_template。因此,如果我希望将“ select_1_2”作为选定的选项(即,如果我希望用户在打开网页时默认看到“千米”),则a_string将存储“ select_1_2”,或者:
a_string = "select_1_2"
正如我已经提到的,a_string
包含的字符串可能会根据用户在网页上的行为而改变。
现在我在这里面临困境。假设a_string
存储“ select_1_2”(即,我希望默认选项显示为'Kilometre')。当我尝试将以下代码放入python中时(希望向用户显示的默认选项为'Kilometre'):
return render_template('index.html',a_string = "selected")
我在网页上显示了“ Metre”(这是第一个选项)(而不是“ Kilometre”)。
因此,我想知道,是否有一种方法可以在使用render_template时将存储在a_string
中的字符串作为selected
传递。
预先感谢您的帮助。
答案 0 :(得分:2)
有两种解决这个问题的方法。
我认为最简单的答案是“以不同的方式做”。您应该生成菜单,而不是将菜单静态地嵌入HTML中:
<select name = "from_length">
{% for optval, optinfo in options.items() %}
<option value="optval" {% if optinfo.selected|default(false) %}selected{% endif %}>
{{ optinfo.name }}
</option>
{% endfor %}
</select>
然后在您的Python代码中,您将定义菜单:
options = {
'choose_1': {'name': 'Metre'},
'choose_2': {'name': 'Kilometre'},
'choose_3': {'name': 'Millimetre'},
}
options['choose_2']['selected'] = True
这使处理“选择了哪个项目”的逻辑更加容易。
但是,如果您有以下条件,请继续使用原来的方法:
a_string = "select_1_2"
然后您可以像这样呼叫render_template
:
return render_template('index.html', **{a_string: "selected"})
答案 1 :(得分:0)
我不确定我是否正确理解了您的问题。您的目标是在下拉菜单中动态地预先选择一个选项?
在这种情况下,请从列表中创建选项标签,并传递一个整数,该整数指示应预先选择哪些选项。
render_tempalte('index.html', options=["Meter", "Kilometer", "Millimeter"], preselect= 1)
index.html删除
<select name = "from_length">
{% for option in options%}
{% if loop.index0 == preselect %}
<option selected>{{option}}</option>
{% else %}
<option>{{option}}</option>
{% endif %}
{% endfor %}
</select>
PS:如果您还希望控制选项标签之外的值,则可能希望传递一个元组列表(而不只是一个列表)。
答案 2 :(得分:0)
@larsks的答案是最好的Python方法,但是,如果您不想大幅重组传递给模板的数据,则只需使用Jquery:
在您的模板中,传回您希望选择的value
标签的HTML option
:
return render_template('index.html', to_select = "choose_2") #for 'Kilometre' to be selected
然后,在您的模板中:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<select name = "from_length" data-select='{{to_select}}' id='select_pannel'>
<option value = "choose_1">Metre</option>
<option value = "choose_2" >Kilometre</option>
<option value = "choose_3">Millimetre</option>
</select>
<script>
$(document).ready(function(){
var to_select = $("#select_pannel").data('select');
$('option').each(function(){
if ($(this).val() === to_select){
$(this).attr('selected', true)
}
});
});
</script>