Реализация Django тега шаблона, осведомленного о его экземплярах в расширенных шаблонах - PullRequest
0 голосов
/ 06 февраля 2020

Я начал работать с 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 зависимостями.

Спасибо!

...