【问题标题】:Template tag and request object模板标签和请求对象
【发布时间】:2011-09-24 05:40:35
【问题描述】:

每次向我的应用发出请求时,我都会使用中间件来检索和存储一个“页面”对象,该对象包含与该特定页面相关的信息。我在请求对象中存储了对该对象的引用,这是一个示例:

class PageMiddleware(object):
    def process_request(self, request):
        if not hasattr(request, 'page'):
            request.page = Page.objects.get(slug=<slug>)
        return None

它工作得很好,但我想在模板标签中访问这个对象。模板标签仅引用“上下文”思想,这意味着我无法看到我的 Page 对象。

我知道我可以为此使用自定义上下文处理器,但这意味着要进一步修改设置文件,我想尝试尽可能地封装这个应用程序。例如,我注意到 Debug Toolbar 应用程序在不修改 TEMPLATE_CONTEXT_PROCESSORS 的情况下设法将数据附加到模板上下文。

简而言之,理想情况下,我想通过使用中间件来访问模板标签中的 Page 对象。有什么想法吗?

编辑:我使用的是标准模板标签,具有以下类:

class GetPageContentNode(Node):
    def __init__(self, key):
        self.key = key

    def render(self, context):
        return context['request'].page

【问题讨论】:

    标签: django


    【解决方案1】:

    看看这个,你可以在注册模板标签的时候通过takes_context来访问请求对象(和你的对象)

    Access request in django custom template tags

    在此页面上搜索“takes_context”:

    https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#registering-the-tag

    【讨论】:

    • 感谢您的回复。我应该在我的原始帖子中说我使用的是标准标签而不是包含标签。调用 context['request'] 会导致键错误。
    • 它也应该适用于普通的模板标签。包含和简单模板标签只是普通模板标签的包装器
    【解决方案2】:

    使用context_instance 参数调用每个render_to_response,例如:

    def some_view(request):
        # ...
         return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))
    

    按照Daniel Roseman 的建议编辑:

    并将django.core.context_processors.request 添加到您的TEMPLATE_CONTEXT_PROCESSORS 设置中。

    【讨论】:

    • 其实你不需要这个的第二部分 - 已经有一个request context processor,虽然你需要在settings.py中专门启用它。
    【解决方案3】:

    试试这个:

    class GetPageContentNode(Node):
        def __init__(self, key):
            self.key = key
    
        def render(self, context):
            request = template.Variable('request').resolve(context) # here's the magic!
            return request.page
    

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 2017-05-17
      • 2012-08-06
      • 2011-07-13
      • 2013-08-18
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多