-
Новичок в Django. Недавно приступил к созданию первого тестового проекта на Django. Возник вопрос с использованием нескольких блочных тегов в базовом шаблоне. Например title. Известно, что этот тег как правило необходимо использовать в странице 2 раза, пример:
<title>{% block title %}{% endblock %}</title>
...
<h1>{% block title %}{% endblock %}</h1>
Django вызывает исключение TemplateSyntaxError at /
'block' tag with name 'title' appears more than once
Как быть? -
Выносить в отдельный файл и инклюдить
-
Вы можете назвать второй блок как угодно, например htitle, а переменную в нем отдавать такую же. Сама идея блоков в том, чтобы не было повторяющихся названий. Это просто именованные области вывода. Их содержимое можно переопределить в дочерних шаблонах (если это был базовый шаблон). Подробнее почитайте в Django book: http://djangobook.com
<title>{% block title %}{{mytitle}}{% endblock %}</title>
...
<h1>{% block htitle %}{{mytitle}}{% endblock %}</h1> -
Да но тогда в каждом представлении мне нужно будет объявлять переменную mytitle, и передавать ее в шаблон. А мне хотелось просто воспользоваться фичей наследования шаблонов, как это кстати описано в главе "Наследование шаблонов" в DjangoBook. Именно там в примере используется заголовок страницы подключаемый в базовый шаблон из шаблона представления.
—Выносить в отдельный файл и инклюдить
Если я делаю так блок вынесенный {% include 'includes/head.html'%} в этот отдельный файл не переопределяется. -
Свой inclusion tag
-
Соглашусь с Сашей — свой inclusion tag тут как раз хорош, если title и h1 формируются по какому-то общему принципу. Или еще можно не тегом, а в контекст-процессоре передавать что-то типа:
return { 'title': _get_title(), 'header': _get_title(), } -
Есть тикет в траке у джанги на тему множественного отображения блоков, но он давно уже "Design decision needed". Так что оптимальнее всего просто пересмотреть логику отображения информации.
-
Всем спасибо за советы. Попробую разные варианты.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.



