Как вложить или совместно использовать два тега шаблона в шаблонах Django?

Я пытаюсь использовать фильтры шаблонов для запуска цикла, но я не могу объединить два оператора python в одном операторе/шаблоне. Как правильно объединить две переменные в шаблоне? См. синтаксис и объяснение ниже:

Я создаю форум с двойным индексом, то есть у меня есть col-md-2 со списком категорий. У каждой категории есть форумы, и в зависимости от того, какая категория выбрана, форумы этой категории заполняют следующий столбец col-md-2. Оставшийся столбец col-md-8 получает свое содержимое в зависимости от того, какая категория и какой форум выбраны.

Моя логика:

Я определил тег шаблона, который загружает список категорий, который никогда не меняется, независимо от того, какая страница загружается или какая категория или форум выбраны. Так что работает нормально. Но в зависимости от выбранной категории мой второй столбец должен быть заполнен. Для этого я пытаюсь определить собственный фильтр (ниже). Однако я не уверен, как это использовать, так как его нужно передать другому шаблону, где он запускает цикл для рендеринга html. Даже если я создам цикл for в этом шаблоне (вместо того, чтобы передать его другому), мне все равно придется делать вложенные теги шаблона, что-то вроде: {% for forum in {{ forum.category|forumindexlistbycategory }} %} В обоих случаях я получаю ошибку типа Invalid filter: 'forumindexlistbycategory' или "with" in u'include' tag needs at least one keyword argument.

Я определил следующий пользовательский фильтр шаблона в моем pybb_tags.py:

from pybb.models import Forum

@register.filter
def forumindexlistbycat(category):
    forumlistbycat = Forum.objects.filter(category=category)
    return forumlistbycat

И в моем шаблоне я пытаюсь загрузить его следующим образом:

{% load i18n pybb_tags %}

<div class='category'>
    {% if category %}
    <h3>{{ category }}</h3>
    {% include 'pybb/forumindex_list.html' with forum_list=category.forums_accessed category=category parent_forum='' %}
    {% else %}
    <h3>{{ forum.category }}</h3>
    {% include 'pybb/forumindex_list.html' with forum_list= %}{{ forum.category|forumindexlistbycategory }}
    {% endif %}
</div>

person Dr Confuse    schedule 10.09.2016    source источник


Ответы (1)


Поэтому вы должны сначала правильно зарегистрировать тег шаблона.

from django import template
from pybb.models import Forum

register = template.Library()

@register.filter
def forumindexlistbycat(category):
    forumlistbycat = Forum.objects.filter(category=category)
    return forumlistbycat

Поместите приведенный выше код в файл с именем вашего фильтра, поэтому forumindexlistbycat.py переместите этот файл в папку templatetags в вашем приложении. Если у вас нет этой папки, вы должны ее создать. Не забудьте добавить пустой файл __init__.py в папку templatetags. И теперь вы можете использовать его в шаблоне, поэтому:

{% load i18n forumindexlistbycat %}

Когда ваш тег шаблона зарегистрирован, вы загружаете его по имени. И затем вы используете его как:

{% include 'pybb/forumindex_list.html' with forum_list=forum.category|forumindexlistbycategory %}

Дополнительные сведения см. в Руководстве по пользовательским тегам и фильтрам шаблонов.

person toffi9    schedule 10.09.2016
comment
Привет. Имя пользовательского файла тега шаблона, содержащего этот пользовательский фильтр, — pybb_tags.py, поэтому я пробовал каждый из {% load i18n pybb_tags forumindexlistbycat %}, {% load i18n pybb_tags %} и {% load i18n pybb_tags %} {% forumindexlistbycat as forumindexlistbycategory %}, но каждый раз получал одну из этих двух ошибок: Invalid block tag on line 2: 'forumindexlistbycat'. Did you forget to register or load this tag? или 'forumindexlistbycat' is not a registered tag library.. Я думаю, что ваш синтаксис может быть верным, но как мне правильно загрузить этот фильтр в мой шаблон? - person Dr Confuse; 10.09.2016
comment
Попробуйте назвать файл тегов своим фильтром и поместите его в папку «templatetags» в каталоге вашего приложения. Таким образом, у него есть путь вроде «../app/templatetags/forumindexlistbycat.py». - person toffi9; 10.09.2016
comment
Добавьте также пустой файл __init__.py в папку templatetags. - person toffi9; 10.09.2016
comment
Если у вас все еще есть проблема, попробуйте перезапустить runserver. - person toffi9; 10.09.2016
comment
Эй, спасибо, теперь все работает. Я все равно добавлю комментарий к этой теме, если мне понадобится дополнительная помощь в этой области, поскольку я работаю над ней прямо сейчас, но в качестве благодарности я добавлю ваш ответ как принятый. :-) - person Dr Confuse; 10.09.2016