django自定义模板标签中的访问请求,使用标签装饰器
Posted
技术标签:
【中文标题】django自定义模板标签中的访问请求,使用标签装饰器【英文标题】:Access request in django custom template tags, using the tag decorator 【发布时间】:2013-03-30 21:19:42 【问题描述】:有一个题目和题目相同的问题: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
参数是否有原因?
如何使用此装饰器(以及请求对象)访问模板上下文?
【问题讨论】:
【参考方案1】:回答 2 个子问题:
tag
装饰器接受takes_context
参数是否有原因?
这是因为,正如您所说,tag
在模板的较低级别,解析器级别运行。那时没有上下文。
如何使用此装饰器(以及请求对象)访问模板上下文?
我不认为你可以。同样,因为它是解析器级别的东西。一个有趣的例子是block
标签。为了能够覆盖block
标签,它使用extend
标签来传递一些信息。
我正在为类似的情况而苦苦挣扎。我唯一能想到的就是为process_request
制作中间件,它会重置我在标签中访问的一些全局/单例上下文。但是,如果模板在请求之外(例如在命令中)呈现,这将无济于事。
【讨论】:
【参考方案2】:@register.tag
只接受两个参数:名称和编译函数。我想你可以尝试通过编译函数中的token argument 传递request
。
更新:
也可以在Noderender
方法中访问
class TestTagNode(template.Node):
def render(self, context):
return context['request'].user
@register.tag
def test_tag(parser, token):
return TestTagNode()
【讨论】:
当然将请求作为参数传递是可行的,但我正在寻找一个不需要的解决方案...... 感谢这次更新,但我仍然需要在标签函数中访问请求,而不是在节点中。奇怪的是没有办法做到这一点,没有明确地将请求作为参数传递,我想避免这种情况。以上是关于django自定义模板标签中的访问请求,使用标签装饰器的主要内容,如果未能解决你的问题,请参考以下文章