2011-06-28 136 views
1

每次向我的应用程序发出请求时,我都会使用中间件来检索并存储具有与特定页面相关的信息的“页面”对象。我存储请求对象这个对象的引用,这里有一个例子:模板标记和请求对象

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

它的工作原理不够好,但我想在一个模板标签访问该对象。模板标签只能引用'context'思想,这意味着我无法看到我的Page对象。

我知道我可以使用自定义上下文处理器为此,但这意味着进一步修改设置文件,我想尽量保持此应用程序尽可能封装。例如,我注意到,调试工具栏应用程序管理将数据附加到模板上下文而无需修改TEMPLATE_CONTEXT_PROCESSORS。

简而言之,我想通过仅使用中间件来访问模板标记中的页面对象。有任何想法吗?

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

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

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

回答

2

看一看这一点,你可以在注册时通过传递takes_context可以访问请求对象(和你的对象)模板标签

Access request in django custom template tags

有此页上的 “takes_context” 搜索:

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

+0

感谢您的答复。我应该在我的原文中说过我使用的是标准标签而不是包含标签。调用上下文['请求']导致键错误。 – Hanpan

+0

它也应该在普通模板标签上工作。包含&简单模板标签只是普通模板标签的包装器 –

1

通话每render_to_responsecontext_instance参数,如:

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

编辑者:Daniel Roseman为sugested:

并添加django.core.context_processors.requestTEMPLATE_CONTEXT_PROCESSORS设置。

+1

实际上,您不需要第二部分 - 已经有[请求上下文处理器](https://docs.djangoproject.com/en/1.3/ ref/templates/api /#django-core-context-processors-request),不过你需要在settings.py中专门启用它。 –

+0

@Daniel:完美。 –

0

试试这个:

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