[英]Passing a string in Python as a variable to render_template() in Flask
考虑一个 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 显示给用户时,用户将在下拉菜单中默认看到“公里”(而不是“米”,这是第一个选项)
因此,简而言之,我试图向用户显示默认列表选项(即“米”、“公里”或“毫米”之一)。 默认列表选项取决于用户的选择,因此可能会有所不同。
现在,我来到我的问题的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”(即,我希望向用户显示默认选项为“公里”)。 当我尝试将以下代码放入 python 时,(目的是向用户显示的默认选项应为“公里”):
return render_template('index.html',a_string = "selected")
我在 web 页面(而不是“公里”)上显示“米”(这是第一个选项)。
所以,我想知道,是否有办法在使用 render_template 时传递存储在a_string
selected
的字符串。
提前感谢您帮助我。
有几种方法可以解决这个问题。
我认为最简单的答案是“以不同的方式做”。 与其将菜单静态嵌入到 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"})
我不确定,如果我正确理解了你的问题。 您的目标是在下拉列表中动态预选一个选项?
如果是这种情况,请从列表中创建选项标签并传递 integer,它指示应预先选择哪些选项。
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:如果您还想控制选项标签之外的值,您可能想要传递一个元组列表(而不仅仅是一个列表)。
@larsks 的答案是最好的 Pythonic 方法,但是,如果您不想大幅重组传递给模板的数据,您可以简单地使用 Jquery:
在您的模板中,传回您希望选择的option
标签的 HTML value
:
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.