2013-06-18 20 views
6

Với các tình huống sau:Django: thêm ngữ cảnh để đáp ứng sử dụng trang trí

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') 

Tôi muốn có trang trí thêm một cuốn từ điển ngữ cảnh để xem, để các chức năng trang trí được trả về ngoại hình như thế này :

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

Điều này có khả thi không?

+0

Vâng, chắc chắn. điều đó là có thể. Có rất nhiều chức năng xem decotarors. [ở đây] (https://docs.djangoproject.com/en/dev/topics/http/decorators/) bạn là someones – lalo

+2

Đây chính xác là những gì [ContextProcessors] (https://docs.djangoproject.com/en/ dev/ref/templates/api/# subclassing-context-requestcontext) dành cho. – J0HN

+0

Đối với tất cả các mẫu: Bộ xử lý ngữ cảnh. Đối với một số Chế độ xem: trang trí – lalo

Trả lời

4

Sau một loạt tìm kiếm, tôi đã tìm ra cách để thực hiện việc này theo cách không yêu cầu thêm bất kỳ dấu hiệu nào trong hàm ban đầu, giữ mọi thứ KHÔ. Điều quan trọng là đối tượng TemplateResponse của Django, giúp ngăn chặn việc hiển thị khuôn mẫu cho đến trước khi phản hồi được gửi tới người dùng, mở ra các cơ hội để xử lý bởi người trang trí (và phần mềm trung gian, FWIW).

Đây là những gì nó trông giống như bây giờ:

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

Bạn nói đúng, nhưng hãy cẩn thận bởi vì phản hồi không phải lúc nào cũng là một TemplateResponse. – s29

3

này là không thể cách bạn đang có chức năng của bạn bằng văn bản, nhưng bạn có thể làm điều gì đó như sau cho các hành vi tương tự:

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) 

này sẽ làm cho trang trí để thêm từ điển context của mình vào kết thúc các đối số vị trí được chuyển vào index(), sau đó được chuyển vào render().

Các vấn đề liên quan