2

我有一个继承基本模板的 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) 中没有任何复杂的内容。

Django 明确表示这是可能的

当您加载自定义标签或过滤器库时,标签/过滤器仅对当前模板可用 - 而不是模板继承路径上的任何父模板或子模板。

例如,如果模板 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>

我猜是我的错。活到老,学到老。

4

2 回答 2

3

问题是您的get_flatpages标签位于父模板的任何块之外。这意味着它根本不会被调用。

将其移动到内容块中,它应该可以工作。

于 2014-09-25T21:08:49.913 回答
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 文档对此不是很清楚。

于 2017-01-13T13:10:13.363 回答