2014-09-25 4 views
1

У меня есть приложение Django (1.6), которое наследует базовый шаблон. Я хотел бы включить одну из моих (в настоящее время работающих) flatpages в целевую страницу приложения, что-то, что Django docs say is possible.Шаблон шаблона Django flatpages не работает с наследованием шаблона

Вот мой шаблон:

{% 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 %} 

Это не список любого из flatpages. Тем не менее, если я удалю {% 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> 

Все работает. Я вижу количество flatpages в моем fp объекте (9), а мой неупорядоченный список отображает все URL-адреса и заголовки.

Мне кажется, что это ошибка в том, как работают flatpages или как Django наследует шаблоны.

Базовый шаблон (/path/to/base.html) не имеет в нем ничего сложного.

Django categorically says that this is possible:

При загрузке пользовательских тегов или фильтр библиотеки, теги/фильтры только доступны на текущий шаблон - не какие-либо родительские или дочерние шаблоны по пути шаблонов наследования.

Например, если шаблон foo.html имеет {% load humanize%}, то дочерний шаблон (например, тот, который имеет {% extends "foo.html"%}), не будет иметь доступа к шаблону гуманизации теги и фильтры. Детский шаблон отвечает за свой {% load humanize%}.

Это функция для удобства и разумности.

Кто-нибудь еще заметил эту ошибку? Это исключение только для встроенного приложения flatpages?

EDIT 1:

Daniels ответ является правильным. example code from the Django docs не показывает в том числе содержание flatpage внутри {% block %}, так что я не ожидал, что это должно было быть сделано:

{% load flatpages %} 
{% get_flatpages as flatpages %} 
<ul> 
    {% for page in flatpages %} 
    <li><a href="{{ page.url }}">{{ page.title }}</a></li> 
    {% endfor %} 
</ul> 

Моя вина, я думаю. Живи и учись.

ответ

2

Проблема заключается в том, что ваш тег get_flatpages находится вне любых блоков из родительского шаблона. Это означает, что это просто не будет вызвано.

Переместите его в блок контента, и он должен работать.

+1

Hi Daniel - Спасибо! Это сработало. Странно, что документация Django прямо не говорит об этом, или, может быть, я просто плотный ... – tatlar

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 %} 

И да, Джанго документация не очень понятно, на что.

Смежные вопросы