Запуск произвольного кода Python в шаблоне Django намеренно отключен. Помимо соображений безопасности, причина в том, что бизнес-логи c вашего проекта должна быть отделена от уровня представления. Это часть хорошего дизайна приложения.
Есть три основных способа вызвать операцию из шаблона Django.
- Передать функцию и вызвать ее.
- Используйте шаблонный фильтр, настраиваемый или встроенный.
- Используйте тег шаблона, настраиваемый или встроенный.
Передайте функцию и вызовите ее.
Вызов переданной функции из шаблона Django является стандартным. Однако здесь есть два предостережения.
- Функция должна возвращать значение, которое может быть строкой или может быть приведено к строке. (В противном случае в шаблоне ничего не будет напечатано.)
- Функция не должна иметь никаких обязательных аргументов.
Наиболее распространенный вариант использования - это вычисленное значение или геттер, например
class Page(models.Model):
title = models.CharField()
def get_title(self):
return self.title
<h1>{{ page.get_title }}</h1>
Шаблонные фильтры
См. ответ Мелвина для примера шаблонных фильтров.
Шаблонные фильтры работают со значением. Так что это идеально подходит для функции Python, такой как type()
.
Теги шаблона
Отредактировано: см. Комментарий Мелвина.
Простые теги шаблона с другой стороны, работать больше как функция. Они принимают позиционные аргументы и аргументы ключевого слова и должны снова возвращать значение. Я не буду включать go в теги включения или расширенную компиляцию и рендеринг тегов здесь, но вы можете прочитать об этом в документации по тегам Django .
Вот пример из двух шаблонных тегов, которые я часто включаю в проект в debug.py
.
import pprint
from django import template
register = template.Library()
pp = pprint.PrettyPrinter(indent=4, width=120)
@register.simple_tag(takes_context=True)
def print_context(context):
pp.pprint(context)
return ""
@register.simple_tag()
def print_thing(thing):
pp.pprint(thing)
return ""
Я могу использовать print_context
для печати текущего контекста в терминале и print_thing
для печати чего-либо.
{% load debug %}
{% print_context %}
{% print_thing 'print this string' %}
Вы можете создать тег шаблона, который будет делать все, что может делать стандартная функция Python. Это связано с тем, что тег шаблона по существу вызывает создаваемую вами функцию.
Используйте ограничения системы шаблонов Django в своих интересах для создания хорошо спроектированных приложений, в которых бизнес-лог c находится в представлениях, модели и помощники, а не в шаблонах.