因此message_set
已被棄用,以支持新消息框架。好老message_set
允許我給離線用戶留言(例如,當我在cron工作中做一些事情時,我可能想通知某些用戶)。現在看一下新的框架,似乎只能將消息添加到request
對象。Django - 使用新消息框架將消息留給(離線)用戶
我錯過了任何東西,或者是向user
消息添加消息的功能,這意味着我將不得不推出自己的產品?
因此message_set
已被棄用,以支持新消息框架。好老message_set
允許我給離線用戶留言(例如,當我在cron工作中做一些事情時,我可能想通知某些用戶)。現在看一下新的框架,似乎只能將消息添加到request
對象。Django - 使用新消息框架將消息留給(離線)用戶
我錯過了任何東西,或者是向user
消息添加消息的功能,這意味着我將不得不推出自己的產品?
它看起來不像你缺少任何東西。將消息添加到user
對象的功能將在Django 1.2中棄用,並在1.4中完全刪除(來自django身份驗證文檔here)。並且沒有一個新的消息存儲後端被預先推出用於消息的持久性(例如數據庫或文件存儲)。
但一切都不會丟失。我在新的消息存儲後端代碼中沒有看到任何內容,它堅持在存儲消息時提供有效請求(例如,存儲來自例如cron作業的消息)。如果我是你,我會推出自己的後端,將消息存儲在數據庫表中。
編輯:你如何實現這個
如果確定與實施離線消息存儲爲螺栓到新的消息後端的一個可能的方法是一個:
定義消息型號
class UserMessage(models.Model):
user = models.ForeignKey('auth.User')
message = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
手動從您的cron作業創建UserMessages
def some_func_in_my_cron_job():
...
UserMessage.create(user=some_user, message="Something happened")
...
設置中定義一個新的信息存儲引擎,覆蓋現有的引擎之一,並重新定義_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
打開新郵件引擎:
MESSAGE_STORAGE = 'myproj.custom_message_storage.MyStorageEngine'
使用這種方法,您不會使用新的消息api寫入數據庫後端,但您可以讀取用它手動設置消息。希望這可以幫助。
有人創造了一個很好的實現這一點,可能是基於公認的答案:
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)
的信息將顯示到下一個頁面加載的用戶。
messages_extends爲Django的消息框架 https://github.com/AliLozano/django-messages-extends/blob/master/README.md
如果你的settings.py使用messages_extends.storages.FallbackStorage
,您可以創建一個持久消息(直到用戶點擊x
將顯示indefinetely),使用:
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!')
以下是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)
其他存儲可能只是將消息存儲在內存中,所以你真的沒有它。
感謝您的回答。編寫消息存儲後端應該很容易。但是,將消息綁定到用戶並在用戶上線時顯示該消息很複雜。有什麼建議麼? – shanyu 2010-01-02 22:17:13
添加了一種可能的方法作爲對答案的編輯。 – zlovelady 2010-01-03 02:20:26
非常有幫助。謝謝.. – shanyu 2010-01-03 14:10:29