Динамическое меню Django в глобальном представлении (base.html) будет отображаться во всех шаблонах.

Я создал веб-сайт с парой шаблонов, но я хотел бы добиться того, чтобы читать меню из БД в base.html, которое было бы видно на всем веб-сайте, я не хочу добавлять его в каждый шаблон. Я нашел в документах пример POLL:

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#inclusion-tags

Скриншоты ошибки

TemplateSyntaxError at / Недопустимый тег блока: 'show_menu'

Синтаксическая ошибка шаблона

Base.html Ошибка

В приложении я сделал: templatetags/menu.py

from django import template
register = template.Library()

@register.inclusion_tag('menu.html')
def show_menu(menu):
    menu = Menu.objects.all()
    return {'menu': menu}

base.html

{% load menu %}
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
    {% show_menu menu %}
    {% block content %}{% endblock %}
</body>
</html>

index.html

{% extends "base.html" %}

{% block content %}
Hello World! (Content)
{% endblock %}

Помогите пожалуйста, что я делаю не так? Спасибо


person Radek    schedule 31.03.2013    source источник


Ответы (1)


Похоже, вы на самом деле не читали ту страницу документации, на которую ссылаетесь. Во-первых, он дает четкие инструкции о том, куда поместить код тега шаблона: не в view.py, а в новый файл внутри каталога templatetags внутри вашего приложения.

Во-вторых, на этой странице также объясняется, что вам нужно загрузить каждую библиотеку тегов, которую вы используете, в каждый шаблон, который их использует: поэтому, предположив, что вы поместили свой тег в templatetags/menu.py, вы должны сделать {% load menu %}.

person Daniel Roseman    schedule 31.03.2013
comment
Я отредактировал код, как указано выше, я создал папку TEMPLATETAGS под приложением и поместил файл MENU.PY с кодом. Затем я сделал в шаблоне: {% load menu %}, теперь я получил эту ошибку: меню не является допустимой библиотекой тегов: меню библиотеки шаблонов не найдено, попробовал django.templatetags.menu, django.contrib.staticfiles.templatetags. меню, django_admin_bootstrapped.templatetags.menu, django.contrib.admin.templatetags.menu, cl.ly/image/3J0t3N061e12< /а> - person Radek; 01.04.2013
comment
Я обнаружил проблему, добавив файл init.py в каталог templatetags. Теперь у меня проблема с тем, что глобальное имя «Меню» не определено, если я добавлю модели импорта из django.db из меню импорта моделей, это вызовет ошибку: «меню» не является допустимой библиотекой тегов: ImportError поднял загрузку ng .templatetags.menu: нет модулей с именами моделей - person Radek; 01.04.2013
comment
Зачем вам импортировать модели из django.db? Они в вашем приложении, где бы оно ни было. from myapp.models import Menu. - person Daniel Roseman; 01.04.2013