Вложенные теги шаблона из контекста - PullRequest
1 голос
/ 11 декабря 2011

У меня есть случай, когда мне нужно установить переменную шаблона с другим вложенным тегом переменной шаблона в контексте (представления) и использовать механизм шаблонов django для анализа тега и вложенного тега.

Имею ввиду:

page['title'] = 'This is a test title for page {{ page.foo }}'
page['foo']   = 'Test'
...
render_to_response('x.html', {'page':page})

В шаблоне у меня есть:

<html>
....
<title>{{page.title}}</title>
...</html>

Как получить page.title для анализа встроенного тега page.foo во время рендеринга?

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Вы можете создать шаблонный тег, который отображает переменную в текущем контексте.Обратитесь к https://docs.djangoproject.com/en/dev/howto/custom-template-tags/ для получения общей информации о пользовательских шаблонных тегах.

Результат:

{% load renderme %}
{% renderme page.title %}

Становится (для предоставленного вами контекста):

This is a test title for page Test 

Код тега шаблона (вам нужно улучшить проверку ввода, особенно он еще не принимает передачу строки напрямую):

from django import template
from django.template.context import Context
from django.template.base import Template

class RenderNode(template.Node):

    def __init__(self, template_string_name = ''):
        self.template_string_name = template_string_name

    def render(self, context):
        ''' If a variable is passed, it is found as string, so first we use render to convert that
            variable to a string, and then we render that string. '''
        self.template_string = Template('{{ %s }}' % self.template_string_name).render(context)
        return Template(self.template_string).render(context)

def render_me(parser, token):
    try:
        tag_name, template_string_name = token.split_contents()
    except Exception:
        raise template.TemplateSyntaxError('Syntax for renderme tag is wrong.')
    return RenderNode(template_string_name)

register = template.Library()
register.tag('renderme', render_me)

Вот, пожалуйста!Вам нужно будет использовать тег вместо простой переменной или фильтра, но он делает то, что вы описали.

1 голос
/ 11 декабря 2011

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

ЗдесьЕсть некоторые вещи, которые немного приблизятся, может быть, это поможет.

Самый простой: просто используйте Python %s, чтобы сделать это на ваш взгляд

page['title'] = 'This is a test title for page %s' % page['foo']

Если вы хотите использовать Djangoрендеринг:

page['title'] = Template(page['title']).render(Context({'page': page, }))

По вашему мнению, это This is a test title for page {{ page.foo }} с page в качестве контекста.

Если вы использовали вещи только из контекста по умолчанию, вы можете написать фильтркоторая отображает текущую строку с таким контекстом, как {{ page.title|render }}.Но я не знаю, как получить весь контекст из шаблона, так что это будет работать только для значений контекста по умолчанию.

РЕДАКТИРОВАТЬ : найденный другой способ создастновый ответ.

...