Как я могу получить визуализированный вывод шаблона в теге шаблона в django? - PullRequest
2 голосов
/ 10 апреля 2011

Отказ от ответственности: Это продолжение вопроса моего предыдущего вопроса .

Я пытаюсь написать тег шаблона в Django, который будет отображаться внутри тела Мако.Шаблон.Я не уверен, что это достижимо, но это то, что было бы чрезвычайно полезно для моего проекта, и, вероятно, многие другие люди, использующие шаблоны Mako в Django.

Вот определение моего тега:

def extends_mako(parser, token):
    # wishlist below, this code does not work but it's what I want to achieve
    template_html = ''
    while (node = parser.nodelist.pop()):
        template_html += node.render()

Способен ли объект синтаксического анализа отображать все дерево до этой точки?Моя единственная идея на данный момент - использовать объект парсера для рендеринга (и удаления из дерева) каждого узла, предшествующего этому.Затем я передаю вывод в Mako для рендеринга в виде HTML и использую его в качестве вывода для функции рендеринга узла, который я определяю.Я надеюсь, что когда к шаблону вызывается render, ему нужно будет только визуализировать этот один узел, поскольку мой шаблонный тег уже выполнил компиляцию для всего остального.Намерение состоит в том, чтобы использовать тег extends_mako в качестве последнего тега в дереве.

Я провел небольшое быстрое исследование pdb.set_trace, но пока не вижу ничего полезного.

Так;Можно ли использовать объект синтаксического анализатора, переданный в тег шаблона, для компиляции шаблона и получения окончательного визуализированного вывода?

1 Ответ

1 голос
/ 13 апреля 2011

Это не решение, специфичное для вашей проблемы, но может привести вас в правильном направлении.Я недавно взял шаблонный тег Django «spaceless» и добавил поддержку, чтобы не убирать пробелы при отладке.

Часть этого тега шаблона пропускает список узлов шаблона, собранных между {% spaceless%} {% endpaceless%} теги, которые в теории могут дать вам узлы, предшествующие вашему узлу ...

from django.conf import settings
from django import template
from django.utils.html import strip_spaces_between_tags

register = template.Library()

class SmartSpacelessNode(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist

    def render(self, context):
        content = self.nodelist.render(context)
        #from here, you can probably delete the nodes after you've rendered
        #the content to a variable, then render your tag
        return content if settings.DEBUG else strip_spaces_between_tags(content.strip())

@register.tag
def smart_spaceless(parser, token):
    nodelist = parser.parse(('end_smart_spaceless',))
    parser.delete_first_token()
    return SmartSpacelessNode(nodelist)

Надеюсь, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...