1

有一道题同题:django custom template tags中的Access request

提出的解决方案,例如传递takes_context = True给装饰器对于标签助手(simple_tag,inclusion_tagassignment_tag)非常有效,但不适用于低级tag装饰器。

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

引发异常:

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

2个问题:

  • tag装饰者接受这个takes_context论点有什么原因吗?
  • 如何使用此装饰器(以及请求对象)访问模板上下文?
4

2 回答 2

1

@register.tag只接受两个参数:名称和编译函数。我认为您可以尝试在编译函数中request传递令牌参数。

UPD:
也可以在 Noderender方法中访问

class TestTagNode(template.Node):
    def render(self, context):
        return context['request'].user

@register.tag
def test_tag(parser, token):
    return TestTagNode()
于 2013-04-08T19:12:53.457 回答
1

回答 2 个子问题:

tag装饰者接受这个takes_context论点有什么原因吗?

这是因为,正如您所说,tag它是在模板的较低级别、解析器级别运行的。那时没有上下文。

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

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

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

于 2014-09-22T11:59:10.303 回答