Django flatpages模板标记不适用于模板继承

时间:2014-09-25 21:03:55

标签: python django django-1.6 django-flatpages

我有一个继承基本模板的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>

我猜错了。生活和学习。

2 个答案:

答案 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文档对此并不十分清楚。