tạo bộ xử lý ngữ cảnh của riêng tôi trong django


81

Tôi đã đến một thời điểm mà tôi cần phải chuyển một số biến nhất định cho tất cả các chế độ xem của mình (chủ yếu là các biến loại xác thực tùy chỉnh).

Tôi đã nói rằng viết bộ xử lý ngữ cảnh của riêng tôi là cách tốt nhất để làm điều này, nhưng tôi đang gặp một số vấn đề.

Tệp 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 có thể thấy, tôi có một mô-đun được gọi là 'context_processors' và một hàm trong đó có tên là 'say_hello'.

Trông như thế nào

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

Tôi có đúng khi cho rằng bây giờ tôi có thể làm những điều sau trong quan điểm của mình không?

{{ say_hello }}

Ngay bây giờ, điều này không hiển thị 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")

Câu trả lời:


54

Bộ xử lý ngữ cảnh bạn đã viết sẽ hoạt động. Vấn đề là ở cách nhìn của bạn.

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

Ví dụ:

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

Chế độ xem ở trên sẽ không sử dụng các bộ xử lý ngữ cảnh được liệt kê trong TEMPLATE_CONTEXT_PROCESSORS. Đảm bảo rằng bạn đang cung cấp một loại RequestContextnhư vậy:

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

1
'Context_instance' là thứ bị thiếu! Cảm ơn TM
dotty

Theo dõi, tại sao tôi cần context_instance này? Tại sao tôi không cần cái này nếu tôi sử dụng hệ thống xác thực của django?
dotty

1
Các khung nhìn dựng sẵn của Django xử lý điều này cho bạn (họ sử dụng a RequestContext). Hãy nghĩ về bộ xử lý ngữ cảnh mà bạn đã tạo. Nó coi requestnhư một đố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. RequestContextvề cơ bản chỉ xử lý logic đơn giản của việc 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 đến chúng, sau đó cập nhật ngữ cảnh trang với kết quả.
TM.

Tôi có thể sửa đổi chế độ xem của mình để yêu cầu ngữ cảnh không?
dotty

3
@TM. return render_to_response('template.html', context_instance=RequestContext(request))là Fasion cũ, tôi nghĩ return render(request,'template.html')là DRY hơn
suhailvs

29

Theo tài liệu django, bạn có thể sử dụng renderlàm lối tắt thay vì render_to_response với đối số context_instance:

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


Thật vậy, những ngày này điều đó là có thể.
fabspro

9

Kể từ Django 1.8, bạn đăng ký bộ xử lý ngữ cảnh tùy chỉnh của mình như sau:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            'templates'
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'www.context_processors.instance',
            ],
        },
    },
]

giả xử lý ngữ cảnh của bạn là trong ứng dụng wwwtrongcontext_processors.py


2

Nếu bạn đang sử dụng Django's render_to_response() phím tắt để điền vào một mẫu với nội dung của từ điển, mẫu của bạn sẽ được chuyển một phiên bản Ngữ cảnh theo mặc định (không phải a RequestContext). Để sử dụng một RequestContexttrong kết xuất mẫu của bạn, hãy sử dụng render()phím tắt giống như một lệnh gọi đến render_to_response()với một context_instanceđối số buộc sử dụng a RequestContext.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.