使用标签装饰器在django自定义模板标签中访问请求

时间:2013-04-08 17:16:24

标签: django django-templates

有一个问题具有相同的标题和问题:Access request in django custom template tags

建议的解决方案,例如将takes_context = True传递给装饰器,可以很好地用于标记助手(simple_taginclusion_tagassignment_tag),但不适用于低级别tag装饰者。

@register.tag(takes_context=True)
def mytag(parser, token):
   ...

提出异常:

  

tag()得到了一个意外的关键字参数'takes_context'

2个问题:

  • 是否有tag装饰器确实接受takes_context参数的原因?
  • 如何使用此装饰器(以及请求对象)访问模板上下文?

2 个答案:

答案 0 :(得分:1)

@register.tag只接受两个参数:名称和编译功能。我想你可以尝试在编译函数中通过request传递render

UPD:
您也可以在节点class TestTagNode(template.Node): def render(self, context): return context['request'].user @register.tag def test_tag(parser, token): return TestTagNode() 方法

中访问它
{{1}}

答案 1 :(得分:1)

回答2个子问题:

  

tag装饰器是否确实接受takes_context参数?

这是因为,正如您所说,tag运行在较低级别,即模板的解析器级别。那时没有背景。

  

如何使用此装饰器(以及请求对象)访问模板上下文?

我认为你不能。再次,因为它是一个解析器级别的东西。一个有趣的例子是block标签。为了能够覆盖block代码,它会使用extend代码传递一些信息。

我正在与类似的情况作斗争。我唯一能想到的是为process_request制作中间件,重置我在标签中访问的一些全局/单例上下文。但是,如果模板在请求之外呈现(例如在命令中),这将无济于事。