2013-06-18 60 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()