首页 文章

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

提问于
浏览
0

Environment :Python 3.6,Flask 1.02,Jinja2

目的:

  • 在layout.html中创建一个动态菜单(由content.html扩展)

  • 但动态元素的url_for经常需要传递参数

Issue statement :渲染模板时如何在Jinja模板中传递url_for的参数?

我觉得我需要在Jinja中使用str() . format的语法 .

我试过了:

1. pass each part as a separate value:

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. tried to use the {% set var_name: passed_variable %}

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

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

神社

{% 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. tried to pass whole content of url_for as a string:

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

然而它再次失败,因为url_for syntacs将整体放在撇号之间,最后我不需要它 .

我扫描过的一些参考资料 . Flask context-processor

如果我为每个内容页面创建每个导航栏的另一个模板,它可以工作 - 但是通过该移动我可以简单地将导航栏移动到内容页面 . 然而,这似乎很无聊 . Stack Overflow topic

Thus question: 我怎么能通过

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

    叹了口气......几小时后我才发现如何构造语法 . 我希望它会帮助别人!

    渲染期间:

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

相关问题