Глядя на источник, в то время как объект Template
будет иметь доступ к имени шаблона (через .name
), это значение никогда не передается объекту Parser ипоэтому он недоступен для тегов шаблона.
Существуют различные способы сделать имя шаблона доступным для самого шаблона (путем добавления его в контекст), но не внутри тегов шаблона.
Как ДаниэльРоузман упомянул в комментариях: если вы можете уточнить, чего вы на самом деле пытаетесь достичь, возможно, есть лучший способ добиться того, чего вы хотите.Без обид, но это звучит так, как будто это может быть XY проблема .
Из-за академического интереса у меня была быстрая скрипка, чтобы посмотреть, возможно ли это.Насколько я вижу, это возможно, но не без изменения или исправления источника django.
Примечание: следующее не является рекомендуемым решением и просто намекает на то, чтоможет потребоваться на самом деле сделать эту работу.Не использовать для производственного кода.
Изменяя django.template.base.py
со следующими изменениями, мы добавляем атрибут .template_name
к объекту синтаксического анализатора, делая его доступным для тегов шаблона.
- Добавлен необязательный аргумент для
compile_string
- Добавлено имя шаблона в качестве дополнительного атрибута для анализатора
- Передается в имени шаблона при вызове
compile_string()
Чтобы проверить это, я определил следующий тег, который просто возвращает имя шаблона заглавными буквами:
from django.template.base import Node, Library
register = Library()
class TemplateNameNode(Node):
def __init__(self, template_name):
self.name = template_name
def render(self, context):
return self.name.upper()
@register.tag
def caps_template_name(parser, token):
return TemplateNameNode(parser.template_name)
и следующий шаблон:
{% load mytags %}
Template name in caps: {% caps_template_name %}
Кажется, это работает при тестировании в ./manage.py shell
:
>>> from django.template import loader, Context
>>> t = loader.get_template("test.html")
>>> t.render(Context({}))
u'\nTemplate name in caps: TEST.HTML\n'
Хотя это, кажется, работает, я должен повторить, что ручное исправление источника django никогда не является хорошим решением и может подвергаться всевозможным страданиям при переходе на другие версии.