如何从Jinja2扩展访问上下文

时间:2013-10-01 12:34:49

标签: django request jinja2

我有一个Django模板的节点:

class MetadataNode(template.Node):
    def render(self, context):
    ...

注册标签:

def get_metadata(parser, token):
    ...
register = template.Library()
register.tag(get_metadata)

但我使用的是Jinja2模板,因此我需要一个Jinja2扩展名:

class get_metadata(Extension):
    tags = {'get_metadata'}

    def parse(self, parser):
        while not parser.stream.current.type == 'block_end':
            parser.stream.next()
        return nodes.Output([self.call_method('_get_metadata')])

    def _get_metadata(self):
        return Markup(MetadataNode().render(<Django context???>))

register = CoffinLibrary()
register.tag(get_metadata)

如何在parse方法中访问Django上下文(特殊性request.META.PATH_INFO)? 或者如何使用上下文运行渲染MetadataNode?

1 个答案:

答案 0 :(得分:0)

您可以使用contextfunction包装器。

from jinja2 import contextfunction

class get_metadata(Extension):
    tags = {'get_metadata'}

    def parse(self, parser):
        while not parser.stream.current.type == 'block_end':
            parser.stream.next()
        return nodes.Output([self.call_method('_get_metadata')])

    @contextfunction
    def _get_metadata(self, context):
        req = context.get("request")
        if not req:
            return None
        return req["META"]["PATH_INFO"]

register = CoffinLibrary()
register.tag(get_metadata)