我有一个继承基本模板的Django(1.6)应用程序。我想将我的一个(当前正在工作的)平面页面包含在应用程序登录页面中,这是Django docs say is possible。
这是我的模板:
{% 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)中的flatpages数量,我的无序列表显示了所有平面网址和标题。
在我看来,无论是平板如何工作,还是Django如何进行模板继承,这都是一个错误。
基本模板(/path/to/base.html
)中没有任何复杂的内容。
Django categorically says that this is possible:
加载自定义标记或过滤器库时,标记/过滤器仅可用 到当前模板 - 而不是模板继承路径中的任何父模板或子模板。
例如,如果模板foo.html具有{%load humanize%},则为子模板(例如,一个 有{%extends&#34; foo.html&#34; %})将无法访问人性化模板标签和过滤器。 子模板负责自己的{%load humanize%}。
这是为了可维护性和理智而开发的功能。
有没有人注意到这个错误?只是内置的flatpages应用程序是个例外吗?
编辑1:
Daniels的回答是正确的。 example code from the Django docs并未在{% block %}
内显示平面内容,因此我并不认为需要完成此操作:
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
我猜错了。生活和学习。
答案 0 :(得分:3)
问题是您的get_flatpages
标记位于父模板的任何块之外。这意味着它根本就不会被召唤。
将其移至内容块中,它应该可以正常工作。
答案 1 :(得分:0)
只是重申正确的解决方案 - get_flatpages
需要将放在内部它将被引用的块中。所以这将有效:
{% extends "index.html" %}
{% load flatpages %}
{% block footer %}
{% get_flatpages as flatpages %}
{% for page in flatpages %}
...
{% endfor %}
这不会工作:
{% extends "index.html" %}
{% load flatpages %}
{% get_flatpages as flatpages %}
{% block footer %}
{% for page in flatpages %}
...
{% endfor %}
是的,Django文档对此并不十分清楚。