Динамические элементы навигационной панели - переданы из Flask в Jinja - унаследованный шаблон макета - PullRequest
0 голосов
/ 06 октября 2018

Среда : Python 3.6, Flask 1.02, Jinja2

Цель:

  • Создать динамическое меню в layout.html (которое расширяется содержимым.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]

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

Это могло бы сработать, если бы я создал другой шаблон каждой панели навигации для каждой страницы контента - но при этом я мог просто переместить панель навигации на страницу контента.Однако это кажется скучным. Тема переполнения стека

Таким образом, вопрос: Как я могу передать

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 Ответ

0 голосов
/ 06 октября 2018

вздох .. после нескольких часов я только нашел, как построить синтаксис.Я надеюсь, что это поможет другим!

Во время рендеринга:

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

...