将Python中的字符串作为变量传递给Flask中的render_template()

时间:2019-11-19 12:29:18

标签: python flask jinja2

考虑一个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传递。

预先感谢您的帮助。

3 个答案:

答案 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>