2010-05-23 27 views
58

Tôi đã đến một điểm mà tôi cần phải chuyển các biến nhất định cho tất cả các chế độ xem của tôi (chủ yếu là các biến loại xác thực tùy chỉnh).tạo bộ xử lý ngữ cảnh của riêng tôi trong django

Tôi được cho biết viết bộ xử lý ngữ cảnh của riêng mình là cách tốt nhất để thực hiện việc này, nhưng tôi đang gặp một số vấn đề.

tập tin cài đặt của tôi trông như thế này

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "django.contrib.messages.context_processors.messages", 
    "sandbox.context_processors.say_hello", 
) 

Như bạn thấy, tôi có một module gọi là 'context_processors' và một chức năng trong đó gọi là 'say_hello'.

nào trông giống như

def say_hello(request): 
     return { 
      'say_hello':"Hello", 
     } 

Tôi có quyền để thừa nhận bây giờ tôi có thể làm như sau trong quan điểm của tôi?

{{ say_hello }} 

Hiện tại, điều này không có gì trong mẫu của tôi.

Quan điểm của tôi trông giống như

from django.shortcuts import render_to_response 

def test(request): 
     return render_to_response("test.html") 

Trả lời

41

Bộ xử lý bối cảnh mà bạn đã viết nên làm việc. Vấn đề là trong quan điểm của bạn.

Bạn có tích cực rằng chế độ xem của bạn đang được hiển thị với RequestContext?

Ví dụ:

def test_view(request): 
    return render_to_response('template.html') 

Quan điểm trên sẽ không sử dụng bộ vi xử lý bối cảnh được liệt kê trong TEMPLATE_CONTEXT_PROCESSORS. Hãy chắc chắn rằng bạn đang cung cấp một RequestContext như vậy:

def test_view(request): 
    return render_to_response('template.html', context_instance=RequestContext(request)) 
+1

'context_instance' là những gì bị thiếu! Cảm ơn TM – dotty

+0

Theo dõi, tôi cần bối cảnh này như thế nào? Làm thế nào đến tôi không cần điều này nếu tôi sử dụng hệ thống auth django? – dotty

+0

Chế độ xem tích hợp của Django xử lý điều này cho bạn (chúng sử dụng 'RequestContext'). Hãy nghĩ về bộ xử lý ngữ cảnh mà bạn đã tạo. Nó lấy 'request' làm đối số. Điều đó có nghĩa là bạn cần bằng cách nào đó đưa ra yêu cầu hiện tại cho logic kết xuất. 'RequestContext' về cơ bản chỉ xử lý logic đơn giản lặp qua tất cả các bộ xử lý ngữ cảnh và chuyển yêu cầu hiện tại tới chúng, sau đó cập nhật ngữ cảnh trang với kết quả. –

24

Theo django docs bạn có thể sử dụng render như một phím tắt thay vì render_to_response với lập luận context_instance:

Ngoài ra, sử dụng các phím tắt render() đó là giống như lời gọi hàm render_to_response() với đối số context_instance buộc sử dụng RequestContext.

+0

Thật vậy, những ngày này là có thể. – fabspro

2

Nếu bạn đang sử dụng render_to_response() shortcut của Django để cư một mẫu với các nội dung của một cuốn từ điển, mẫu này sẽ được thông qua một ví dụ Bối cảnh theo mặc định (không phải là một RequestContext). Để sử dụng số RequestContext trong kết xuất mẫu của bạn, hãy sử dụng phím tắt render() giống như cuộc gọi đến render_to_response() với đối số context_instance buộc sử dụng RequestContext.

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