Динамические элементы навигационной панели - переданы из Flask в Jinja - унаследованный шаблон макета
Среда: Python 3.6, Flask 1.02, Jinja2
Задача:
- Создайте динамическое меню в layout.html (которое расширяется content.html)
- все же url_for динамического элемента часто требует передачи параметра
Проблема: Как я могу передать параметры для url_for в шаблоне Jinja при рендеринге шаблона?
Я чувствую, что мне нужен синтаксис формата str(). В Jinja..
Я пытался:
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: прошло_вариабельно%}
Построенный на 1-й версии меню, определенной на стороне сервера, я попытался установить переменные в 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 syntacs помещает целое между апострофами, которые мне не понадобятся в конце.
Некоторые ссылки, которые я просмотрел. Контекстный процессор Flask
Это могло бы сработать, если бы я создал другой шаблон каждой навигационной панели для каждой страницы контента - но с этим движением я мог просто переместить навигационную панель на страницу контента. Однако это кажется скучным. Тема переполнения стека
Таким образом, вопрос: как я могу передать
param_id=paramval['id']
для синтаксиса url_for во время рендеринга
{{ url_for('edit_question', param_id=paramval['id']) }}
Код / структура 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)
извините за стену текста..
1 ответ
Вздох.. после нескольких часов я просто нашел, как построить синтаксис. Я надеюсь, что это поможет другим!
Во время рендеринга:
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 %}