2013-06-18 141 views
6

考虑以下情形添加上下文响应:Django的:用装饰

from django.shortcuts import render 


def decorator(view): 
    def wrapper(request, *args, **kwargs): 
     context = {'foo': 'bar'} 
     # Logic ... 
     return view(request, *args, **kwargs) 
    return wrapper 


@decorator 
def index(request): 
    return render(request, 'index.html') 

我想有装饰添加上下文字典视图,使得被退回看起来像这样的装饰功能:

return render(request, 'index.html', context) 

这可能吗?

+0

是的,当然。这是可能的。有很多视图函数decotarors。 [这里](https://docs.djangoproject.com/en/dev/topics/http/decorators/)你是某人 – lalo

+2

这正是[ContextProcessors](https://docs.djangoproject.com/en/ dev/ref/templates/api /#subclassing-context-requestcontext)。 – J0HN

+0

对于所有模板:上下文处理器。对于某些视图:装饰器 – lalo

回答

4

经过一番搜索之后,我已经想出了如何以一种不需要在原始函数中添加额外噪点的方式来做到这一点,让事情保持干爽。关键是Django的TemplateResponse对象,该对象将响应发送给用户之前推迟模板的呈现,从而为装饰器(以及中间件,FWIW)提供处理机会。

下面是它看起来像现在:

from django.template.response import TemplateResponse  

def decorator(view): 
    def wrapper(request, *args, **kwargs): 
     r = view(request, *args, **kwargs) 
     r.context_data = {'foo': 'bar'} 
     return r.render() 
    return wrapper 

@decorator 
def index(request): 
    return TemplateResponse(request, 'index.html') 
+2

你是对的,但只是要小心,因为响应并不总是一个TemplateResponse。 – s29

3

这是不可能的,你现在有你的函数编写方式,但你可以做这样的事情对于同样的行为如下:

from django.shortcuts import render  

def decorator(view): 
    def wrapper(request, *args, **kwargs): 
     context = {'foo': 'bar'} 
     args = args + (context,) 
     return view(request, *args, **kwargs) 
    return wrapper  

@decorator 
def index(request, *args): 
    return render(request, 'index.html', *args) 

这将导致装饰添加您context字典到传递到index()的位置参数的结尾,然后传递到render()