Серверная часть настраиваемого шаблона ¶
Пользовательские бэкэнды ¶
Вот как реализовать собственный шаблонный бэкэнд, чтобы использовать другую систему шаблонов. Бэкэнд шаблона - это наследующий класс
django.template.backends.base.BaseEngine
. Его необходимо реализовать
get_template()
и по желанию from_string()
. Вот пример вымышленной foobar
библиотеки шаблонов:
from django.template import TemplateDoesNotExist, TemplateSyntaxError
from django.template.backends.base import BaseEngine
from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy
import foobar
class FooBar(BaseEngine):
# Name of the subdirectory containing the templates for this engine
# inside an installed application.
app_dirname = 'foobar'
def __init__(self, params):
params = params.copy()
options = params.pop('OPTIONS').copy()
super().__init__(params)
self.engine = foobar.Engine(**options)
def from_string(self, template_code):
try:
return Template(self.engine.from_string(template_code))
except foobar.TemplateCompilationFailed as exc:
raise TemplateSyntaxError(exc.args)
def get_template(self, template_name):
try:
return Template(self.engine.get_template(template_name))
except foobar.TemplateNotFound as exc:
raise TemplateDoesNotExist(exc.args, backend=self)
except foobar.TemplateCompilationFailed as exc:
raise TemplateSyntaxError(exc.args)
class Template:
def __init__(self, template):
self.template = template
def render(self, context=None, request=None):
if context is None:
context = {}
if request is not None:
context['request'] = request
context['csrf_input'] = csrf_input_lazy(request)
context['csrf_token'] = csrf_token_lazy(request)
return self.template.render(context)
См. DEP 182 для получения дополнительной информации.
Интеграция отладки для пользовательских движков ¶
На странице отладки Django есть перехватчики для предоставления подробной информации при возникновении ошибки шаблона. Пользовательские механизмы шаблонов могут использовать эти перехватчики для улучшения информации трассировки, отображаемой для пользователей. Доступны следующие крючки:
Посмертный шаблон ¶
Вскрытие появляется при TemplateDoesNotExist
подъёме. В нем перечислены механизмы и загрузчики шаблонов, которые использовались при попытке найти данный шаблон. Например, если настроено два движка Django, постмортем будет выглядеть так:

Пользовательские двигатели могут заполнить Вскрытие путем пропускания backend
и
tried
аргументов при подъеме TemplateDoesNotExist
. Бэкенды, которые используют постмортем, должны указывать источник в объекте шаблона.
Информация о контекстной строке ¶
Если ошибка возникает во время синтаксического анализа или рендеринга шаблона, Django может отобразить строку, в которой произошла ошибка. Например:

Пользовательские механизмы могут заполнять эту информацию, устанавливая template_debug
атрибут для исключений, возникающих во время синтаксического анализа и рендеринга. Этот атрибут имеет dict
следующие значения:
'name'
: Имя шаблона, в котором произошло исключение.'message'
: Сообщение об исключении.'source_lines'
: Строки до, после и включая строку, в которой произошло исключение. Это для контекста, поэтому он не должен содержать более 20 строк или около того.'line'
: Номер строки, в которой произошло исключение.'before'
: Содержимое строки ошибки перед токеном, вызвавшим ошибку.'during'
: Токен, вызвавший ошибку.'after'
: Содержимое строки ошибки после токена, вызвавшего ошибку.'total'
: Количество строк вsource_lines
.'top'
: Номер строки, с которойsource_lines
начинается.'bottom'
: Номер строки, на которойsource_lines
заканчивается.
Учитывая указанную выше ошибку шаблона, это template_debug
будет выглядеть так:
{
'name': '/path/to/template.html',
'message': "Invalid block tag: 'syntax'",
'source_lines': [
(1, 'some\n'),
(2, 'lines\n'),
(3, 'before\n'),
(4, 'Hello {% syntax error %} {{ world }}\n'),
(5, 'some\n'),
(6, 'lines\n'),
(7, 'after\n'),
(8, ''),
],
'line': 4,
'before': 'Hello ',
'during': '{% syntax error %}',
'after': ' {{ world }}\n',
'total': 9,
'bottom': 9,
'top': 1,
}
Origin API и сторонняя интеграция ¶
В шаблонах Django есть Origin
объект, доступный через template.origin
атрибут. Это позволяет отображать отладочную информацию в шаблоне postmortem , а также в сторонних библиотеках, таких как панель инструментов отладки Django .
Пользовательские механизмы могут предоставлять свою собственную template.origin
информацию, создавая объект, который задает следующие атрибуты:
'name'
: Полный путь к шаблону.'template_name'
: Относительный путь к шаблону, переданный в методы загрузки шаблона.'loader_name'
: Необязательная строка, определяющая функцию или класс, используемый для загрузки шаблона, напримерdjango.template.loaders.filesystem.Loader
.