Фильтры шаблонов Django, теги, простые теги и теги включения - PullRequest
29 голосов
/ 07 апреля 2011

Это более общий вопрос о различиях между этими четырьмя различными видами тегов django.Я только что прочитал страницу документации по шаблонным тегам: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Но мне трудно понять, когда мне следует использовать один вариант над другим.Например, что может сделать тег шаблона, чего не может сделать simple_tag?Ограничен ли фильтр только манипулированием строками, и поэтому в документации сказано, что теги шаблонов более мощные, потому что они могут «делать что угодно»?

Вот мое восприятие различий:

  • шаблонные фильтры: работают только со строками и возвращаемыми строками.Нет доступа к моделям?
  • теги шаблона: доступ ко всему, к чему вы можете получить доступ в представлении, скомпилированном в узлы с указанной функцией рендеринга (кажется, что единственным преимуществом является то, что вы можете добавлять переменные в контекст?)
  • simple_tags: принимает строки и переменные шаблона и возвращает строку; вам передается значение переменной шаблона, а не сама переменная (когда вы захотите, чтобы сама переменная превысила значение?)
  • теги включения: позволяют отображать произвольные дополнительные шаблоны

Может ли кто-нибудь привести пример, описывающий, когда я хотел бы использовать один из них поверх другого?

Спасибо.

1 Ответ

47 голосов
/ 07 апреля 2011

Шаблонные фильтры могут работать на любом объекте (и не более двух одновременно).Это просто функции, которые принимают один или два аргумента.например,

# filter implementation
@filter
def myfilter(arg1, arg2):
    ....

# usage in template
{{ arg1|myfilter:arg2 }}

Они ограничены в том, что не могут получить доступ к контексту шаблона и могут принимать только ограниченное количество аргументов.

Вариант использования : Вы хотитеслегка измените одну из переменных в контексте перед ее печатью.

Теги шаблона могут изменить способ анализа остальной части шаблона и иметь доступ ко всему в контексте, в которомОни используются.Они очень мощные.Например, я написал тег шаблона, который подклассов {% extends %} и позволяет шаблону расширять различные шаблоны в зависимости от текущего пользователя.

Вы можете легко распознать теги шаблона, когда они используются, потому что они окружены в {% и %}.

Вариант использования : вы хотите выполнить некоторую логику, требующую кода Python и доступа к контексту шаблона.

Теги включения по-прежнему являются шаблонными тегами, но Django предоставляет несколько помощников (например, @inclusion_tag декоратор), чтобы упростить написание шаблонных тегов такого типа.

Вариант использования : Вы хотитесделать один шаблон в другой.Например, у вас может быть реклама на вашем сайте, которую вы хотите использовать в разных местах.Возможно, не удастся использовать наследование шаблонов для достижения того, чего вы хотите, поэтому вместо многократного копирования / вставки HTML-кода объявления вы должны написать тег включения.

Причина, по которой вы будете использовать включениетег поверх существующего тега шаблона {% include %} означает, что вам может потребоваться отобразить шаблон с контекстом, отличным от того, в котором вы находитесь. Возможно, вам нужно выполнить несколько запросов к базе данных, чтобы выбрать правильное объявление для показа.Это невозможно с {% include %}.

Простыми тегами , такими как теги включения, простые теги по-прежнему являются шаблонными тегами, но имеют ограниченную функциональность и написаны в упрощенном виде.Они позволяют вам написать тег шаблона, который принимает любое количество аргументов (например, {% mytag "some str" arg2 arg3 %} и т. Д.), И требуют, чтобы вы реализовали только функцию, которая может принимать эти аргументы (и, необязательно, переменную context, чтобы предоставить вам доступ к контексту шаблона)..

По сути, это обновление от шаблонных фильтров, потому что вместо того, чтобы принимать только 1 или 2 аргумента, вы можете принять столько, сколько захотите (и вы также можете получить доступ к контексту шаблона).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...