Шаблон Django (Wagtail) не распознает тип страницы для условия if

На моем блоге wagtail у меня есть простая модель, которая будет индексной страницей, перечисляющей различные статьи, определенная в моем models.py следующим образом:

class ArticleIndex(Page):
    description = models.CharField(max_length=255, blank=True,)

    content_panels = Page.content_panels + [FieldPanel("description", classname="full")]

У меня есть некоторые шаблонные теги, настроенные для отображения категорий и тегов в боковой панели, которые должны активироваться только на индексной странице, а не на реальных страницах статей. У меня это настроено следующим образом:

  {% if article_index %}

  {% categories_list %}

  {% tags_list %}

  {% endif %}

Если я убираю условие if, все отображается так, как я хочу, поэтому я знаю, что это не проблема с тегами шаблона.

Я не понимаю, почему {% if article_index %} не работает, ведь это тип страницы.

Как я могу вывести фактический тип страницы, чтобы увидеть, где есть расхождение, или понять, почему условие if не выполняется?

{% if article_index %} означает "если переменная article_index определена и имеет истинное значение". Поскольку вы не определили переменную с именем article_index - и в Wagtail нет ничего, что заставило бы переменную с таким именем появиться только потому, что тип страницы - ArticleIndex - это всегда будет false.

С другой стороны, переменная page всегда доступна, поэтому альтернативным способом достижения этой цели было бы:

{% if page.content_type.model == 'articleindex' %}

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

<html>
    <head>...</head>
    <body>
        <div id="sidebar">
            {% block sidebar %}
            {% endblock %}
        </div>
        <div id="content">
            {% block content %}
            {% endblock %}
        </div>
    </body>
</html>

тогда вы можете установить содержимое боковой панели только для индексной страницы статьи, определив {% block sidebar %} в article_index.html:

{% extends "base.html" %}

{% block sidebar %}
    {% categories_list %}
    {% tags_list %}
{% endblock %}

{% block content %}
    main page content goes here
{% endblock %}
Вернуться на верх