【问题标题】:How to get access to context from Jinja2 extension如何从 Jinja2 扩展访问上下文
【发布时间】:2013-10-01 12:34:49
【问题描述】:

我有一个 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)

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

【问题讨论】:

  • 总的来说,我无法通过jinja2的扩展。我注册了一个函数: from coffin.template import Library as CoffinLibrary from jinja2 import Markup def get_metadata(path_info): return Markup(some_python_function(path_info)) register = CoffinLibrary() register.object('get_metadata', get_metadata)`并执行在模板中:{{ get_metadata(request.META.PATH_INFO) }}
  • 这个问题看起来很相似:stackoverflow.com/questions/12139029/…

标签: django request jinja2


【解决方案1】:

您可以使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2016-07-06
    • 2019-03-12
    相关资源
    最近更新 更多