2011-02-07 10 views
9

Próbuję użyć parametru simple_tag i ustawić zmienną kontekstową. Używam wersji bagażniku DjangoDjango simple_tag i ustawianie zmiennych kontekstowych

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 '' 

to robi ustawić zmienną, ale jeśli robię coś bardzo podobnego z @register.tag to działa, ale parametr obiekt nie przechodzi przez ...

Dzięki!

Odpowiedz

18

Mieszacie tutaj dwa podejścia. A simple_tag jest jedynie funkcją pomocniczą, która redukuje niektóre kody standardowego zestawu znaków i ma zwracać ciąg znaków. Aby ustawić zmienne kontekstowe, potrzebujesz (przynajmniej z zwykłym django) do write your own tag za pomocą metody renderowania.

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) 

ten można nazwać tak:

{% do_foo my_object %} 
{% do_foo 25 %} 
+0

dzięki, że jesteś odpowiedź była doskonała i bardzo doceniane – neolaser

+6

Należy zauważyć, że wersja rozwojowa Django zawiera 'assignment_tag' która jest podobna do' simple_tag' ale z zaimplementowanym 'as variablename': https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#assignment-tags –

+0

Huh, nigdy wcześniej nie natknąłem się na' assignment_tag'. Sprytny. Aktualizacja dla przyszłych czytelników: 'assignment_tag' jest dostępny do użytku w wersjach Django> = 1.4 (który, jak zakładam, był w dev, kiedy został zrobiony komentarz powyżej). – chucksmash

Powiązane problemy