我试图使用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
执行非常类似的操作,它可以工作但是对象参数不会通过......
谢谢!
答案 0 :(得分:18)
你在这里混合两种方法。 simple_tag
只是一个辅助函数,它减少了一些样板代码并且应该返回一个字符串。要设置上下文变量,您需要(至少使用plain 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 %}
答案 1 :(得分:0)
自Django 1.9起,it is possible存储simple_tag
的结果是使用模板变量as
和变量名:
@register.simple_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
{% current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>