【问题标题】:Access request in django custom template tags, using the tag decoratordjango自定义模板标签中的访问请求,使用标签装饰器
【发布时间】: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 参数是否有原因?
  • 如何使用此装饰器(以及请求对象)访问模板上下文?

【问题讨论】:

    标签: django django-templates


    【解决方案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()
      

      【讨论】:

      • 当然将请求作为参数传递是可行的,但我正在寻找一个不需要的解决方案......
      • 感谢这次更新,但我仍然需要在标签函数中访问请求,而不是在节点中。奇怪的是没有办法做到这一点,没有明确地将请求作为参数传递,我想避免这种情况。
      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 2021-07-13
      • 2015-02-28
      • 2012-03-15
      • 2015-09-03
      相关资源
      最近更新 更多