Я начал работать с Django шаблоном шаблона, который принимает набор параметров и создает список. Он устанавливает переменные контекста для вывода этого списка после некоторой настройки. Я хотел бы вывести этот список в базовом шаблоне моего проекта.
base. html
{% load mytemplatetag %}
{% mytemplatetag 'foo' 'bar' %}
<!DOCTYPE html>
<html>
<head>
</head>
<body>
{{ mytemplatetag_output }}
</body>
</html>
После рендеринга базового представления вывод должен выглядеть примерно так:
foo
bar
Я бы хотел, чтобы мой тег шаблона знал об этом при использовании в производных шаблонах:
view. html
{% extends 'private/base.html' %}
{% load mytemplatetag %}
{% mytemplatetag 'foo' 'baz' %}
После рендеринга нового представления вывод должен быть чем-то как:
foo
bar
baz
На данный момент моя реализация чем-то похожа на следующий код:
mytemplatetag.py
from django import template
register = template.Library()
@register.tag
def mytemplatetag(parser, token):
paramters = token.split_contents()
tag_name = paramters[0]
items = paramters[1:]
for item in items:
if not (item[0] == item[-1] and item[0] in ('"', "'")):
raise template.TemplateSyntaxError(
"%r tag's argument should be in quotes" % tag_name
)
items = [m[1:-1] for m in items]
return MyTemlpateTagNode(items)
class MyTemlpateTagNode(template.Node):
def __init__(self, items):
self.items = unique(sort(items))
def render(self, context):
context['mytemplatetag_output'] = '\n'.join(self.items)
return ''
Как я могу изменить свой код, чтобы мой экземпляр знать о расширении шаблона для достижения желаемых результатов?
Заранее спасибо!
РЕДАКТИРОВАТЬ:
Я придумал другая идея, которая менее эффективна и которую я нашел, также не работает. Может кто-нибудь объяснить, почему?
mytemplatetag.py
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def mytemplatetag_add(context, item):
if not '_mytemplatetag_items' in context:
context['_mytemplatetag_items'] = []
context['_mytemplatetag_items'].append(item)
return ''
@register.simple_tag(takes_context=True)
def mytemplatetag_output(context):
if not '_mytemplatetag_items' in context:
items = []
else:
items = context['_mytemplatetag_items']
return '\n'.join(unique(sort(items)))
И моя база, и мой вызов расширенного просмотра mytemplatetag_add
, но во время отладки я не вижу вызовов функции с параметрами продлен расширенным видом. Почему это происходит?
Спасибо!
РЕДАКТИРОВАТЬ 2:
Мне удалось заставить мой шаблонный тег работать, но кажется, что звонки на мой функции в дочернем шаблоне обрабатываются только в том случае, если они находятся внутри блока.
Есть ли способ обойти это и позволить вызывать мои функции в любом месте кода дочернего шаблона?
РЕДАКТИРОВАТЬ 3:
Мой код доступен в пакете Django FE Manager . Он используется для управления JS и CSS зависимостями.
Спасибо!