2009-03-30 34 views
6

tôi thường hiển thị thông điệp về hành động sử dụng để đăng nhập người dùng ở lượt xem ứng dụng Django của tôi sử dụng:Làm thế nào để gửi tin nhắn phiên tới một người dùng nặc danh trong một trang web Django?

request.user.message_set.create("message to user") 

Làm thế nào tôi có thể làm tương tự cho vô danh (chưa đăng nhập) người sử dụng? Không có request.user cho người dùng nặc danh, nhưng tài liệu Django nói rằng sử dụng phần mềm trung gian "phiên" bạn có thể làm điều tương tự như mã trên. Các tài liệu Django liên kết đến các phần mềm trung gian phiên tuyên bố nó là có thể, nhưng tôi không thể tìm thấy làm thế nào để làm điều đó từ các tài liệu phiên.

Trả lời

4

Xem http://code.google.com/p/django-session-messages/ cho đến khi bản vá cho phép tin nhắn dựa trên phiên được chuyển sang cây Django (như tôi đã thấy gần đây, nó được đánh dấu là 1,2, vì vậy không có hy vọng bổ sung nhanh ...).

Một dự án khác có chức năng tương tự là Django Flash (http://djangoflash.destaquenet.com/).

+0

tiếc là django_session_messages sẽ không hoạt động với django.core.context_processors.auth xóa tất cả thư của người dùng trước khi mã trong bản vá này sẽ chạy. Có lẽ người ta có thể xem xét lại làm toàn bộ hệ thống tin nhắn trong django. – Evgeny

+0

nếu bạn lật thứ tự của hai bộ xử lý ngữ cảnh trong cài đặt, thứ hai sẽ ghi đè lên danh sách thư, vì vậy nó sẽ không giúp ích gì. – Evgeny

4

Lưu trữ dữ liệu trực tiếp trong phiên, là đối tượng giống như dict. Sau đó, trong khung nhìn/mẫu, kiểm tra giá trị.

biết thêm thông tin ở đây:

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

Bạn cũng có thể tạo ra một lớp trung gian để kiểm tra các đối tượng session trên mỗi yêu cầu, và làm xây dựng của bạn lên/xé xuống đó.

7

Đây là những gì tôi làm, sử dụng bộ vi xử lý ngữ cảnh:

project/application/context.py (kiểm tra thư và thêm chúng vào bối cảnh):

def messages(request): 
    messages = {} 
    if 'message' in request.session: 
     message_type = request.session.get('message_type', 'error') 
     messages = {'message': request.session['message'], 
        'message_type': message_type} 
     del request.session['message'] 
     if 'message_type' in request.session: 
      del request.session['message_type'] 
    return messages 

project/settings.py (thêm bối cảnh cho TEMPLATE_CONTEXT_PROCESSORS):

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.request", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.media", 
    "django.core.context_processors.auth", 
    "project.application.context.messages", 
) 

Với chức năng ở trên messages sẽ được gọi theo mọi yêu cầu và bất kỳ thứ gì mà nó làm lại rns sẽ được thêm vào ngữ cảnh của khuôn mẫu. Với điều này tại chỗ, nếu tôi muốn cung cấp cho người dùng một thông điệp, tôi có thể làm điều này:

def my_view(request): 
    if someCondition: 
     request.session['message'] = 'Some Error Message' 

Cuối cùng, trong một mẫu mà bạn chỉ có thể kiểm tra nếu có sai sót để hiển thị:

{% if message %} 
    <div id="system_message" class="{{ message_type }}"> 
     {{ message }} 
    </div> 
{% endif %} 

Loại tin nhắn chỉ được sử dụng để tạo kiểu tùy thuộc vào nó là gì ("lỗi", "thông báo", "thành công") và cách thiết lập này bạn chỉ có thể thêm 1 tin nhắn cùng một lúc cho người dùng, nhưng đó là tất cả Tôi thực sự cần vì vậy nó hoạt động cho tôi. Nó có thể dễ dàng thay đổi để cho phép nhiều tin nhắn và như vậy.

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