2010-10-03 32 views
6

Có cách nào tôi có thể truy cập ngữ cảnh hiện tại được chuyển qua chế độ xem trong bộ xử lý ngữ cảnh tùy chỉnh để tôi có thể thêm biến bị thiếu nếu tôi muốn thay vì ghi đè biến hiện tại không?Bộ xử lý ngữ cảnh Django: Có thể truy cập ngữ cảnh hiện tại trong ContextProcessor không?

Những gì tôi đang cố gắng để đạt được:

tôi xây dựng URL của tôi như thế này/city_slug/và tôi muốn kiểm tra xem biến thành phố đã tồn tại trong bối cảnh, nếu không tôi muốn thêm thành phố đến bối cảnh của tôi (có thể đang sử dụng thành phố được sử dụng cuối cùng được lưu trong biến phiên, nếu không mặc định là một số thành phố và thậm chí có thể đặt biến phiên để sử dụng tiếp theo.)

Tôi nghĩ đây là vấn đề rất phổ biến, các bạn giải quyết nó như thế nào?

Trả lời

2

Bạn không thể truy cập ngữ cảnh hiện tại từ bên trong bộ xử lý ngữ cảnh và tôi cũng đoán rằng phần mềm trung gian sẽ không phải là giải pháp phù hợp với bạn. Có lẽ nó sẽ có ý nghĩa để tạo ra mẫu của riêng bạn render chức năng mà bạn sử dụng trong quan điểm của bạn và bạn luôn luôn vượt qua nó bối cảnh và yêu cầu hiện tại và đặt các chức năng bạn muốn trong nó và làm cho các mẫu ở cuối với các chức năng rendering thông thường django cung cấp cho bạn!

0

Tôi không chắc liệu bộ xử lý ngữ cảnh mẫu tùy chỉnh có thể thực hiện việc này hay không. Từ documentation:

Một bộ xử lý bối cảnh có một giao diện rất đơn giản: Nó chỉ là một chức năng Python có một đối số, một HttpRequest đối tượng, và trả về một cuốn từ điển mà được thêm vào mẫu ngữ cảnh. Mỗi bộ xử lý ngữ cảnh phải trả về một từ điển.

(Mỏ nhấn mạnh).

Bạn nên xem xét cách viết phần mềm trung gian tùy chỉnh thay thế. Nếu có ai biết cách tạo bộ xử lý ngữ cảnh thì tôi muốn biết.

0

Bạn không thể làm điều này với bộ xử lý ngữ cảnh Django: chúng chỉ có quyền truy cập đối tượng yêu cầu, không phải ngữ cảnh mẫu hiện có mà kết quả của chúng được thêm vào.

Lưu trữ thành phố trong các phiên có vẻ ổn thỏa, nếu đó là những gì bạn muốn. Các mẫu sẽ chịu trách nhiệm về bất kỳ việc mặc định nào khác; nếu bạn cần một cái gì đó ưa thích, bạn có thể muốn nhìn vào gói nó trong một tái sử dụng custom template tag.

2

Bạn có thể đạt được điều này bằng cách sử dụng TemplateResponse và TemplateResponse middleware.

+1

Điều này rất hay, nhưng dường như chỉ hoạt động nếu chế độ xem được tạo theo một cách nhất định để nó trả về một 'TemplateResponse'. Thật không may, 'shortcuts.render_to_response' trả về một' HttpResponse' mặc dù nó hiển thị mẫu, vì vậy đây không phải là giải pháp mạnh mẽ nhất (ví dụ: nếu bạn đang viết thư viện Django). Vì vậy, các nhà văn thư viện: gắn bó với các thẻ mẫu tùy chỉnh. –

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