Списки, вложенные в Flask и Jinja

Я пытаюсь создать меню для веб-приложения, созданного с помощью Flask.

Чтобы создать меню из Python, я передаю список с его элементами каждому представлению, которое включает в себя меню. В Blueprint первое представление, которое принимает это меню, имеет следующий код, где декоратор @filter_menu просто фильтрует список в соответствии с разрешениями, назначенными пользователем , зарегистрированным в , так что он не показывает некоторые зарезервированные параметры. для администратора.

Python
@bp.route('/home', methods=('GET', 'POST'))
@filter_menu
def home(menu):
    return render_template('admin/home.html', menu=menu)

Меню, переданное параметром, а затем переданное функции render_template(menu), представляет собой следующий словарь:

Python
menu = {
            'Inicio': [],
            'Usuarios': [],
            'Trabajadores': ['Estado','Contratos', 'Informes'],
        }

Этот словарь получен шаблоном side_menu.html с следующий код:

Jinja
<nav class="sidemenu">
    <ul>
        {% for key in menu %}
            <li>
                <div>{{ key }}</div>
                {% if menu.key|length != 0 %}
                    <ul>
                        {% for item in key.children  %}
                        <li><div>{{ item }}</div></li>
                        {% endfor %}
                    </ul>
                {% endif %}
            </li>
        {% endfor %}
    </ul>
</nav>

Что я думаю, этот код делает (хотя и не делает), чтобы создать следующую структуру:

<nav>
    <ul>

        <li><div>Inicio</div></li>


        <li><div>Usuarios</div></li>


        <li><div>Trabajadores</div>
                <ul>
                    <li><div>Estado</div></li>

                    <li><div>Contratos</div></li>

                    <li><div>Informes</div></li>

                </ul>
        </li>
    </ul>
</nav>

Однако, когда я включаю его через включение в базовая страница и страница отображаются, я получаю следующее:

<nav>
    <ul>

        <li><div>Inicio</div></li>


        <li><div>Usuarios</div></li>


        <li><div>Trabajadores</div></li>

                <ul>

                    <li><div>Estado</div></li>

                    <li><div>Contratos</div></li>

                    <li><div>Informes</div></li>

                </ul>


    </ul>
</nav>

Последний <li>, рабочий, должен быть в списке, но это не так. Кто-нибудь знает, как мне сказать, почему и как вы можете получить желаемый результат?

Приветствую и благодарю за помощь.

2
задан 27.11.2019, 18:45
1 ответ

Пара вещей. Первые

. Твой синтаксис jinja неправильный. Например aquГ-:

{% for key in menu %}
       ...
                {% if menu.key|length != 0 %}

Переменная key берет как стоимость ключи словаря. Например, под первой iteraciГіn tomarГ - в стоимость Я "Инициализируюсь". Однако menu.key не переводит магически в menu.Inicio, который является тем, что querrГ-схвати, но он пробует соглашаться на так называемый ключ "key". А именно, в твоей структуре данных Пайтон estarГ - в пробуя идти в menu["key"], вместо menu[key], как tГє querrГ-схвати. Так как этот ключ не существует, if он не выполняется и не входит из-за Г©l никогда.

Секунда Точно как следствие предыдущего, так как когда бы то ни было он вводит поэтому if, я не понимаю cГіmo дело в том, что он выходит у тебя sub-menГє в случай "Трудолюбивые". В самом деле не выходит это. Выполняя ты cГіdigo он вытекает:


<nav class="sidemenu">
    <ul>

            <li>
                <div>Inicio</div>

            </li>

            <li>
                <div>Usuarios</div>

            </li>

            <li>
                <div>Trabajadores</div>

            </li>

    </ul>
</nav>

, который консистентный с нею explicaciГіn данность в pГЎrrafo сначала.

SoluciГіn

Para соглашаться на ключ key menГє, как был сказан menu.key, не служит. DeberГ-схвати использовать menu.get(key). С другой стороны, этот синтаксис уже возвращает тебе контент этого элемента словаря, который в твоем случае является списком. Следовательно ты не нуждаешься в том, чтобы использовать .children в ningГєn точка. AsГ - что tambiГ©n ты должен заменять menu.key.children на просто menu.key(). С этим уже он выходит как querrГ-эксперт.

TambiГ©n ты можешь использовать в jinja следующий синтаксис, mГЎs pythГіnica, что предотвращает тебе использование get() и остается mГЎs чистая и читабельная:

<nav class="sidemenu">
    <ul>
        {% for key, submenu in menu.items() %}
            <li>
                <div>{{ key }}</div>
                {% if submenu | length != 0 %}
                    <ul>
                        {% for item in submenu  %}
                        <li><div>{{ item }}</div></li>
                        {% endfor %}
                    </ul>
                {% endif %}
            </li>
        {% endfor %}
    </ul>
</nav>
2
ответ дан 01.12.2019, 10:46

Теги

Похожие вопросы