Django (Wagtail) 模板无法识别 if 条件的页面类型

Django (Wagtail) template not recognizing page type for if condition

在我的 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' %}

但是,由于每种页面类型都有自己专用的模板,因此通常没有必要根据页面类型进行这种检查。在边栏中显示不同内容的正常方法是使用 template inheritance - 例如,如果您的 base.html 模板是:

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

然后你可以通过在article_index.html中定义{% block sidebar %}来设置文章索引页侧边栏的内容:

{% extends "base.html" %}

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

{% block content %}
    main page content goes here
{% endblock %}