动态导航栏元素-从Flask传递到Jinja-继承的布局模板

时间:2018-10-06 10:59:11

标签: python-3.x templates flask jinja2 url-for

环境:Python 3.6,Flask 1.02,Jinja2

目标:

  • 在layout.html(由content.html扩展)中创建动态菜单
  • 但是动态元素的url_for通常需要传递参数

问题声明: 呈现模板时如何在Jinja模板中传递url_for的参数?

我觉得我需要Jinja中的str()。format语法。

我试图:

1。将每个部分作为单独的值传递:

menus = [{'url': 'func_name', 'menu_title': 'title', 'param': 'param_name', 'param_val': 'param_value'}] 
return render_template('content1.html', menus=menus]

在Jinja中,我试图将其命名为:(我也尝试了不使用加号和双引号的情况)

{{ url_for(func_name), param_name+ "=" + param_val }}

在渲染期间会产生以下错误   url_for()接受1个位置参数,但给出了2个

2。尝试使用{%set var_name:Passed_variable%}

建立在服务器端定义的菜单的第一个版本上,我试图在Jinja中设置变量,但也失败了。

menus = [{'url': 'func_name', 'menu_title': 'title', 'param': 'param_name', 'param_val': 'param_value'}] 
    return render_template('content1.html', menus=menus]

Jinja

{% for menu in menus %}
{% set url = menu.get('url') %}
{% set param = menu.get('param') %}
{% set value = menu.get('param_val') %}
{% url_for(url, param + "=" + value %}

但是它也没有用。 感觉好像我为url_for语法提供了一个参数(而不是硬连线的字符串)时,我无法添加参数。

3。尝试将url_for的全部内容作为字符串传递:

menus={'url_string': " 'func_name', param_name=param_value"}

然而,由于url_for句法将整个内容放在撇号之间,它再次失败了,这在最后我不需要。

我浏览过的一些参考文献。 Flask context-processor

如果我为每个内容页面的每个导航栏创建另一个模板,这可能会起作用-但是通过这一动作,我可以将导航栏简单地移动到内容页面。但是,这似乎很乏味。 Stack Overflow topic

这样的问题: 如何通过

param_id=paramval['id']

用于呈现期间的url_for语法

{{ url_for('edit_question', param_id=paramval['id']) }}

代码/结构代码如下: layout.html

<html>
<body>
    {% for menu in menus %}
        {% for key, value in menu.items() %}
            <a href="{{ url_for(value) }}" >
                {{ key }}
            </a>
        {% endfor %}
    {% endfor %}
{% block content %}

{% endblock %}
</body>
</html>

content1.html

{% extends 'layout.html' %}
{% block content %}
 content
{% endblock %}

content2.html

{% extends 'layout.html' %}
{% block content %}
 content
{% endblock %}

app.py

@app.route('/')
def index():
    menus = [{'menu_title1': 'menu_func_name1'}]
    return render_template('content1.html', menus=menus)

@app.route('/menu_details/<int:menu_nr>')
def show_details_of_menu(menu_nr):
    menus = [{'menu_title3': 'menu_func_name3', 'menu_param_name': 'menu_param_value'} 
    return render_template('content2.html', menus=menus)

为文本墙感到抱歉。

1 个答案:

答案 0 :(得分:0)

叹息..下班后我才发现如何构造语法。希望对其他人有帮助!

渲染期间:

menus = [{'url': 'func_name', 'menu_title': 'title', 'parameters': {'param1': param1_value}}]
return render_template('context.html', menus=menus]

在Jinja中,我调整了语法以管理不需要参数的情况:

            {% for menu in menus %}
                {% if menu.get('parameters').items()|length > 0 %}
                    <a href="{{ url_for(menu.get('url'), **menu.get('parameters')) }}">
                        {{ menu.get('menu_title') }}
                    </a>
                {% else %}
                    <a href="{{ url_for(menu.get('url')) }}">
                        {{ menu.get('menu_title') }}
                    </a>
                {% endif %}
            {% endfor %}