2008-12-02 21 views
23

Tôi đang viết một thẻ tùy chỉnh ở Django nên xuất một giá trị được lưu trữ trong một phiên người dùng, nhưng tôi không thể tìm cách truy cập đối tượng phiên từ bên trong một chức năng thẻ tùy chỉnh. Có cách nào để làm điều này, mà không cần gán thủ công đối tượng phiên cho biến ngữ cảnh?Trong Django, có thể truy cập phiên người dùng hiện tại từ trong thẻ tùy chỉnh không?

Trả lời

23

Bạn sẽ có thể thêm bộ xử lý yêu cầu bối cảnh trong tập tin settings.py của bạn:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
"django.core.context_processors.media", 
'django.core.context_processors.request',) 

Điều này sẽ thực hiện tương tự như câu trả lời hiện tại mà không phải thêm tệp tùy chỉnh.

+0

tôi khuyên bạn nên chuyển đổi câu trả lời cho cách tiếp cận này, nó sạch hơn. –

+0

Tôi đã có bộ tiền xử lý đó, nhưng phải bỏ qua thuộc tính phiên. D'oh! Cảm ơn. – knabar

+0

Tôi đã thêm điều này, nhưng làm cách nào để truy cập yêu cầu từ bên trong mẫu? context.session không tồn tại. – Wouter

4

Bạn có thể làm điều này với bộ vi xử lý bối cảnh tùy chỉnh (xem http://docs.djangoproject.com/en/dev/ref/templates/api/)

Trong trường hợp này, bạn muốn tạo một file mới có tên gọi context_processors.py ở mức tương tự như tập tin settings.py của bạn, bao gồm:

def add_session(request): 
    return {'session': request.session} 

Sau đó, trong tập tin settings.py của bạn, thêm:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
"django.core.context_processors.media", 
'context_processors.add_session',) 

Bây giờ bạn sẽ có thể tham khảo nội dung [ 'phiên'] trong thẻ tùy chỉnh của bạn.

Lưu ý rằng điều này sẽ chỉ làm việc cho các mẫu diễn tả với một RequestContext được giao, như trong đoạn mã sau:

def test(request): 
    return render_to_response('test.html',{}, context_instance=RequestContext(request)) 
6

Không có hành vi phạm tội nào mà Sebastian có vẻ như là một hack hữu ích tại một thời điểm, nhưng đủ kỳ lạ vào ngày 24 tháng 12 trong một mục blog về truy cập dữ liệu Người dùng trong Quản trị viên, James Bennett, người quản lý phát hành của Django. about using the threadlocal hack:

Tuyên bố từ chối trách nhiệm chất béo lớn: có rất nhiều công dụng tiềm năng cho các loại tính năng này. Nhiều người trong số họ sai và ngu ngốc và bạn không nên thử họ. ... Ngoài ra, đôi khi bạn sẽ thấy ai đó đề xuất rằng các tính năng này có thể thu được bằng những gì được gọi là "hack luồng chủ đề"; điều này về cơ bản liên quan đến request.user gắn bó vào một loại biến có sẵn trên toàn cầu, và là một điều rất tệ để sử dụng nếu bạn không biết mình đang làm gì. Nó cũng thường là một điều rất tồi tệ để sử dụng ngay cả khi bạn biết bạn đang làm gì, vì bạn có thể chỉ làm điều đó vì bạn lười biếng và không cảm thấy muốn đảm bảo bạn truyền thông tin đúng cách. Vì vậy, nếu bạn thấy ai đó cho rằng bạn làm điều này bằng cách sử dụng "threadlocal", hãy bỏ qua người đó.

Không nói rằng bạn nên bỏ qua Sebastian, nhưng nó có thể đáng giá theo đuổi các con đường khác thay vì sử dụng threadlocal mà không được coi là thực hành tốt nhất.

+0

Đó là một điểm quan trọng nhưng tôi phải gợi ý rằng có lẽ bình luận của ông Bennett đối với các lập trình viên có lẽ là" lười biếng và không cảm thấy thích đảm bảo bạn truyền thông tin đúng cách ". hội chợ. Một vấn đề tái xuất hiện ở Django là tìm ra cách để truyền thông tin xung quanh đúng cách. Thông thường nó không phải là về lười biếng mà là về việc truy cập vào các biến bạn cần, ở tất cả. Mà nói; anh ấy rõ ràng là đúng, rằng việc hack threadlocal là một điều rất xấu. – Teekin

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