2011-02-07 33 views
9

我试图使用simple_tag并设置上下文变量。我现在用的主干版本的DjangoDjango simple_tag和设置上下文变量

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非常类似的东西它的工作原理,但对象参数没有通过......

谢谢!

回答

18

你在这里混合两种方法。 A simple_tag仅仅是一个帮助函数,它可以减少一些样板代码,并且应该返回一个字符串。要设置上下文变量,你需要(至少用普通的django)到write your own tag的渲染方法。

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 %} 
+0

感谢,你的答案是完美的,非常感谢 – neolaser 2011-02-07 03:08:45