Jinja宏没有看到传递给render_template的值

时间:2015-06-09 16:40:14

标签: python flask jinja2

在某些页面上,我希望我的表单按特定顺序下拉,而其他页面则按默认顺序下拉。从我的应用传递特定顺序时,form.html中的宏似乎看不到它。从不使用dropdown,模板始终显示全局数据。为什么会这样?

form.html

    {% if dropdown %}
        <select name="status">
        {% for option in dropdown %}
              <option value="{{ option }}">{{ option }}</option>
        {% endfor %}
        </select>
    {% else %}
        <select name="status">
        {% for option in global_add_links_data()[0] %}
              <option value="{{ option }}">{{ option }}</option>
        {% endfor %}
        </select>
    {% endif %}

app.py

dropdown = [
    'Placed',
    'Review Not Started',
    'Review Passed',
    'Review Failed',
    'Contacted Pending',
    'Contacted Failed',
    'No Contacts',
    'No Reply',
    'Not Interested'
]
dropdown.insert(0, dropdown.pop(dropdown.index(link_status)))
return render_template('view.html', dropdown=dropdown)

1 个答案:

答案 0 :(得分:4)

您没有直接呈现form.html,而是呈现view.html并导入form.htmlWhen importing other templates, the template context is not passed by default. dropdownview.html上下文的本地,因此在form.html中始终未定义。

要导入包含上下文的模板,请使用with context关键字。

{% from "form.html" render_form with context %}

更好,更明确的方法是将dropdown作为参数传递给宏。这样效率更高,因为正如上面提到的文档,导入通常是为了提高性能而缓存的,但使用with context会禁用它。

{% macro render_form(form, dropdown=None) -%}
    {% if dropdown %}
    {% else %}
    {% endif %}
{%- endmacro %}
{% from "form.html" import render_form %}
{{ render_form(form, dropdown) }}