我有一个继承基本模板的 Django (1.6) 应用程序。我想将我的一个(当前工作的)平面页面包含到应用程序登录页面中,Django 文档说这是可能的。
这是我的模板:
{% extends "path/to/base.html" %}
{% load flatpages %}
{% get_flatpages as fp %}
{% block content %}
<h3>Flatpage inclusion</h3>
<p>Number of flatpages: {{ fp|length }}
<ul>
{% for page in fp %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
{% endblock content %}
这没有列出任何平面页面。但是,如果我删除{% extends %}
信号,那么我的代码如下所示:
{% load flatpages %}
{% get_flatpages as fp %}
<h3>Flatpage inclusion</h3>
<p>Number of flatpages: {{ fp|length }}
<ul>
{% for page in fp %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
一切正常。我在我的对象中看到了平面页面的数量fp
(9),我的无序列表显示了所有平面页面的 url 和标题。
在我看来,这似乎是平面页面如何工作或 Django 如何进行模板继承的错误。
基本模板 ( /path/to/base.html
) 中没有任何复杂的内容。
当您加载自定义标签或过滤器库时,标签/过滤器仅对当前模板可用 - 而不是模板继承路径上的任何父模板或子模板。
例如,如果模板 foo.html 具有 {% load humanize %},则子模板(例如,具有 {% extends "foo.html" %} 的模板)将无法访问humanize 模板标签和过滤器。子模板负责自己的 {% load humanize %}。
这是为了可维护性和健全性而设计的功能。
有没有其他人注意到这个错误?仅内置的平面页面应用程序是一个例外吗?
编辑1:
丹尼尔斯的回答是正确的。来自 Django 文档的示例代码没有显示在 a 中包含平面页面内容{% block %}
,所以我没想到需要这样做:
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
我猜是我的错。活到老,学到老。