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

Python 3.x 动态导航栏元素-从Flask传递到Jinja-继承的布局模板,python-3.x,templates,flask,jinja2,url-for,Python 3.x,Templates,Flask,Jinja2,Url For,环境:Python 3.6,Flask 1.02,Jinja2 目标: 在layout.html(由content.html扩展)中创建动态菜单 然而,动态元素的url_通常需要传递一个参数 发布声明: 在呈现模板时,如何在Jinja模板中传递url_的参数 我觉得我需要Jinja中str()格式的语法 我试图: 1。将每个部分作为单独的值传递: menus = [{'url': 'func_name', 'menu_title': 'title', 'param': 'param_name

环境:Python 3.6,Flask 1.02,Jinja2

目标:

  • 在layout.html(由content.html扩展)中创建动态菜单
  • 然而,动态元素的url_通常需要传递一个参数
发布声明: 在呈现模板时,如何在Jinja模板中传递url_的参数

我觉得我需要Jinja中str()格式的语法

我试图:

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

menus = [{'url': 'func_name', 'menu_title': 'title', 'param': 'param_name', 'param_val': 'param_value'}] 
return render_template('content1.html', menus=menus]
menus={'url_string': " 'func_name', param_name=param_value"}
在jinja,我试着这样称呼它:(我也试过不带加号和双引号)

在渲染过程中,它会产生错误 url_for()接受1个位置参数,但给出了2个

2。试图使用{%set var\u name:passed\u variable%}

基于服务器端定义的菜单的第一个版本,我尝试在Jinja中设置变量,但也失败了

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

但它也不起作用。 感觉上,如果我为url_的语法(不是硬连接的字符串)提供一个参数,我就无法添加参数

3。试图将的url\u的全部内容作为字符串传递:

menus = [{'url': 'func_name', 'menu_title': 'title', 'param': 'param_name', 'param_val': 'param_value'}] 
return render_template('content1.html', menus=menus]
menus={'url_string': " 'func_name', param_name=param_value"}
然而,它再次失败,因为syntacs的url_将整个内容放在撇号之间,我在结尾不需要撇号

我浏览了一些参考资料。

如果我为每个内容页创建另一个导航栏模板,它就可以工作了——然而,通过这个移动,我可以简单地将导航栏移动到内容页中。然而,这似乎很乏味

因此问题: 我怎样才能通过考试

param_id=paramval['id']
用于呈现期间语法的url_

{{ 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>
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)
@app.route(“/”)
def index():
菜单=[{'menu_title1':'menu_func_name1'}]
返回呈现模板('content1.html',菜单=菜单)
@应用程序路径(“/菜单\详细信息/”)
def显示菜单的详细信息(菜单编号):
menus=[{'menu_title3':'menu_func_name3','menu_param_name':'menu_param_value'}
返回呈现模板('content2.html',menus=menus)

很抱歉出现了文字墙..

叹气..几个小时后我才发现如何构造语法。我希望它能帮助其他人

渲染期间:

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 %}
{%用于菜单中的菜单%}
{%if menu.get('parameters').items()|长度>0%}
{%else%}
{%endif%}
{%endfor%}

            {% 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 %}