有一个问题具有相同的标题和问题:Access request in django custom template tags
建议的解决方案,例如将takes_context = True
传递给装饰器,可以很好地用于标记助手(simple_tag
,inclusion_tag
和assignment_tag
),但不适用于低级别tag
装饰者。
@register.tag(takes_context=True)
def mytag(parser, token):
...
提出异常:
tag()得到了一个意外的关键字参数'takes_context'
2个问题:
tag
装饰器确实接受takes_context
参数的原因?答案 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
制作中间件,重置我在标签中访问的一些全局/单例上下文。但是,如果模板在请求之外呈现(例如在命令中),这将无济于事。