动态导航栏元素 - 从 Flask 传递到 Jinja - 继承的布局模板
Dynamic nav-bar elements - passed from Flask to Jinja - inherited layout template
环境:Python3.6,Flask 1.02,Jinja2
Objective:
- 在 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]
金贾
{% 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
如果我为每个内容页面的每个导航栏创建另一个模板,它可能会起作用 - 但是通过这个移动,我可以简单地将导航栏移动到内容页面中。然而,这似乎很乏味。
因此问题:
我怎样才能通过
param_id=paramval['id']
渲染期间的 url_for 语法
{{ url_for('edit_question', param_id=paramval['id']) }}
code/structure stg 如下所示:
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)
对不起文字墙..
叹息.. 几个小时后我才发现如何构造语法。希望对其他人有所帮助!
渲染期间:
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 %}
环境:Python3.6,Flask 1.02,Jinja2
Objective:
- 在 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]
金贾
{% 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
如果我为每个内容页面的每个导航栏创建另一个模板,它可能会起作用 - 但是通过这个移动,我可以简单地将导航栏移动到内容页面中。然而,这似乎很乏味。
因此问题: 我怎样才能通过
param_id=paramval['id']
渲染期间的 url_for 语法
{{ url_for('edit_question', param_id=paramval['id']) }}
code/structure stg 如下所示: 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)
对不起文字墙..
叹息.. 几个小时后我才发现如何构造语法。希望对其他人有所帮助!
渲染期间:
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 %}