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_taginclusion_tagassignment_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自定义模板标签中的访问请求,使用标签装饰器的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 模板标签中传递请求

在自定义模板标签中解析 Django 自定义模板标签

Google App Engine 中的 Django 自定义模板标签

在 Django 中自定义模板标签以过滤博客中的特色帖子

Django中的自定义过滤器

Django admin - 如何获取模板标签中的所有注册模型?