繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM