2009-12-31 16 views
5

Vì vậy, message_set không còn được dùng để ủng hộ khung thư mới. Các tốt cũ message_set cho phép tôi để lại tin nhắn cho người dùng ngoại tuyến (ví dụ, khi tôi làm một số công cụ trong một công việc cron tôi có thể muốn thông báo cho một số người dùng về điều đó). Bây giờ hãy xem qua khung mới và có vẻ như một thông điệp chỉ có thể được thêm vào đối tượng request.Django - để lại tin nhắn cho người dùng (ngoại tuyến) bằng cách sử dụng khung thư mới

Tôi có bỏ sót bất kỳ điều gì hoặc chức năng thêm thư vào đối tượng user đã biến mất hay không, điều đó có nghĩa là tôi sẽ phải chuyển đối tượng của riêng mình?

Trả lời

9

Có vẻ như bạn đang thiếu bất kỳ thứ gì. Chức năng thêm thông báo vào đối tượng user sẽ không được dùng nữa trong Django 1.2 và bị xóa hoàn toàn sau 1.4 (từ tài liệu xác thực django here). Và không có chương trình phụ trợ lưu trữ thư mới nào được cuộn trước để lưu giữ lâu bền (ví dụ: lưu trữ tệp cơ sở dữ liệu hoặc tệp) của thư.

Nhưng tất cả không bị mất. Tôi không thấy gì trong mã phụ trợ lưu trữ thư mới, nhấn mạnh rằng bạn cung cấp một yêu cầu hợp lệ khi lưu trữ một thư (vì vậy lưu trữ thư từ, ví dụ, một công việc cron sẽ hoạt động). Nếu tôi là bạn, tôi sẽ cuộn phụ trợ của riêng tôi để ngăn chặn các thông báo trong một bảng cơ sở dữ liệu.

Chỉnh sửa: Làm thế nào bạn có thể thực hiện điều này

Nếu ok bạn với thực hiện việc lưu trữ thông điệp ẩn như một tia vào một trong những backends tin nhắn mới một cách tiếp cận có thể là:

  1. Xác định tin nhắn Mô hình

    class UserMessage(models.Model): 
        user = models.ForeignKey('auth.User') 
        message = models.CharField(max_length=200) 
        created = models.DateTimeField(auto_now_add=True) 
    
  2. Tạo thủ công UserMessages từ công việc định kỳ của bạn

    def some_func_in_my_cron_job(): 
        ... 
        UserMessage.create(user=some_user, message="Something happened") 
        ... 
    
  3. Xác định một công cụ lưu trữ tin nhắn mới, trọng một trong các công cụ hiện có, và xác định lại _GET()

    from django.contrib.messages.storage.session import SessionStorage 
    
    class MyStorageEngine(SessionStorage): 
        def _get(self, *args, **kwargs): 
        if hasattr(self.request, "user") and self.request.user.is_authenticated(): 
         offline_messages = UserMessage.objects.filter(user=self.request.user) 
         # and delete the messages from the database 
        else: 
         offline_messages = None 
    
        other_messages = super(MyStorageEngine, self)._get(*args, **kwargs) 
    
        # all_messages = combine offline_messages and other_messages 
    
        return all_messages 
    
  4. Bật engine tin nhắn mới trong cài đặt:

    MESSAGE_STORAGE = 'myproj.custom_message_storage.MyStorageEngine' 
    

Với phương pháp này, bạn sẽ không ghi vào phần cuối của cơ sở dữ liệu bằng cách sử dụng api nhắn tin mới, nhưng bạn có thể đọc các tin nhắn được thiết lập theo cách thủ công của bạn với nó. Hi vọng điêu nay co ich.

+0

Cảm ơn câu trả lời. Nó sẽ được dễ dàng để viết một lưu trữ tin nhắn phụ trợ. Tuy nhiên, ràng buộc một thông báo cho người dùng và sau đó hiển thị nó khi người dùng đó trở nên trực tuyến phức tạp. Bất kỳ đề xuất? – shanyu

+0

Đã thêm một cách tiếp cận có thể làm bản chỉnh sửa cho câu trả lời. – zlovelady

+0

Rất hữu ích. Cảm ơn.. – shanyu

0

Yêu cầu docs có 4 công cụ lưu trữ khác nhau. Công cụ FallbackStorage ghi vào phiên.

+1

Có, nó ghi vào phiên, thuộc về "yêu cầu". – shanyu

4

Có người đã tạo ra một thực hiện tốt đẹp của này, có thể dựa trên các câu trả lời được chấp nhận:

https://github.com/dym/django-offline-messages

from offline_messages.utils import create_offline_message, constants 

user = User.objects.get(pk=1) 
create_offline_message(user, 'Woo, it worked', constants.SUCCESS) 

Thông báo sẽ được hiển thị cho người sử dụng trên tải trang tiếp theo.

1

Nếu settings.py của bạn đang sử dụng messages_extends.storages.FallbackStorage, bạn có thể tạo ra một thông điệp dai dẳng (sẽ hiển thị indefinetely cho đến khi người dùng nhấp x), sử dụng:

import messages_extends 
from messages_extends.models import Message 
Message.objects.create(user=target_user, level=messages_extends.INFO_PERSISTENT, message='Hey! You will see me until you click X!') 

Đây là định nghĩa cho mô hình Message:

class Message(models.Model): 
    user = models.ForeignKey(User, blank=True, null=True) 
    message = models.TextField() 
    LEVEL_CHOICES = (
     (messages_extends.DEBUG_PERSISTENT, 'PERSISTENT DEBUG'), 
     (messages_extends.INFO_PERSISTENT, 'PERSISTENT INFO'), 
     (messages_extends.SUCCESS_PERSISTENT, 'PERSISTENT SUCCESS'), 
     (messages_extends.WARNING_PERSISTENT, 'PERSISTENT WARNING'), 
     (messages_extends.ERROR_PERSISTENT, 'PERSISTENT ERROR'), 
     ) 
    level = models.IntegerField(choices=LEVEL_CHOICES) 
    extra_tags = models.CharField(max_length=128) 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 
    read = models.BooleanField(default=False) 
    expires = models.DateTimeField(null=True, blank=True) 

Các kho lưu trữ khác có lẽ chỉ lưu trữ thông điệp trong bộ nhớ, vì vậy bạn thực sự không có nó trong tay.

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