Django simple_tag и установка переменных контекста - PullRequest
9 голосов
/ 07 февраля 2011

Я пытаюсь использовать simple_tag и установить переменную контекста. я использую транковую версию django

from django import template

@register.simple_tag(takes_context=True)
def somefunction(context, obj):   
    return set_context_vars(obj)

class set_context_vars(template.Node):
    def __init__(self, obj):
        self.object = obj

    def render(self, context):
        context['var'] = 'somevar'
        return ''

Это не устанавливает переменную, но если я делаю что-то очень похожее с @register.tag, это работает, но параметр объекта не проходит через ...

Спасибо!

1 Ответ

18 голосов
/ 07 февраля 2011

Вы смешиваете два подхода здесь.simple_tag - это просто вспомогательная функция, которая сокращает некоторый шаблонный код и должна возвращать строку.Чтобы установить контекстные переменные, вам нужно (по крайней мере, с простым django) написать свой собственный тег с помощью метода рендеринга.

from django import template

register = template.Library()


class FooNode(template.Node):

    def __init__(self, obj):
        # saves the passed obj parameter for later use
        # this is a template.Variable, because that way it can be resolved
        # against the current context in the render method
        self.object = template.Variable(obj)

    def render(self, context):
        # resolve allows the obj to be a variable name, otherwise everything
        # is a string
        obj = self.object.resolve(context)
        # obj now is the object you passed the tag

        context['var'] = 'somevar'
        return ''


@register.tag
def do_foo(parser, token):
    # token is the string extracted from the template, e.g. "do_foo my_object"
    # it will be splitted, and the second argument will be passed to a new
    # constructed FooNode
    try:
        tag_name, obj = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires exactly one argument" % token.contents.split()[0]
    return FooNode(obj)

Это можно назвать так:

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