現在、ある組織向けのシステムを開発中です。要件の 1 つは、管理者がイベントを作成するたびにユーザーに通知することです。サイトのすべてのユーザーに、電子メールではなく、Facebook の通知に似た方法で通知する必要があります。Django 通知、Django アクティビティ ストリームなどを使用せずに Django でそのような機能を実装するにはどうすればよいですか。この件についてご協力いただければ幸いです。皆さん、ありがとうございました!
2 に答える
それで、私は詳細を知らないので、私は本当にあなたにいくつかの一般的な方向性を与えることができるだけです、しかし基本的にあなたはこのようなことをすることができます:
まず、管理者クラスのsave_model()メソッドにオーバーライドを追加します。ここで、オブジェクトに主キーがまだあるかどうかを確認できます。そうでない場合は、イベントを作成するためのフラグを設定できます(外部キーを介してイベントを通知に関連付ける必要があるかどうかはわかりません)。
イベントと通知を関連付ける必要がない場合は、フラグの設定をスキップして、いつでも通知オブジェクトを作成できます。
次に、イベントのJSONを返すビューを作成します。これらのオブジェクトをどのようにフィルタリングする必要があるかわかりません。ログインしているユーザーなどのみを対象としていますが、これまでに閲覧したことのないユーザーのみを返却したい場合があります。
3番目に、間隔を置いてajaxを介してビューを呼び出し、結果をフィルタリングして通知が表示されたことを記録するために必要な基準を渡します。
それがあなたを動かすことを願っています。
@Zayatzzユーザーに一度通知する予定です。ただし、ユーザーが通知を表示した後でも、後で表示することができます。
この場合、おそらく管理で通知オブジェクトを作成する必要があります。オブジェクトはおそらく次のようなものである必要があります。
class Notification(models.Model):
message = models.TextField()
type = models.IntegerField()
relevancy_end_date = models.DateField()
notified_users = models.ManyToManyField(django.contrib.auth.User, null = True)
管理フォームでは、その models.IntegerField をオーバーライドして、ウィジェットに選択肢を持たせる必要があります。あなたが得ることができる選択肢:
https://docs.djangoproject.com/en/dev/ref/contrib/messages/#creating-custom-message-levels
基本的には、10、20、30、40、50 の数字です。
ビューでは、ユーザーに通知する必要がある通知があるかどうかを確認できます。
notes = Notification.objects.filter(notified_users__id = request.user.id).filter(relevancy_end_date__gte = datetime.datetime.now())
通知がある場合は、djanogs 独自のメッセージ フレームワークを使用してメッセージを作成します。
from django.contrib import messages
if notes:
for note in notes:
messages.add_message(request, note.type, 'Hello world.')
note.notified_users.add(request.user)
メッセージの種類 (情報、エラー、成功) は、通知の種類の列に保存されます。そうです-通知タイプに基づいてメッセージタイプを変えるある種のチェックをそこに追加する必要があります。
ただし、メッセージを表示したい各ビューの先頭にそのブロックを書き込むのはあまりDRYではありません。そのため、独自のビュー デコレータを作成する必要があります。
次の 2 つのリンクが役に立ちます: https://docs.djangoproject.com/en/dev/topics/http/decorators/ ビューを装飾するために Django でデコレータを作成する方法
今この時点で。ユーザーに通知する必要があるメッセージがある場合、それはメッセージ フレームワークによって処理される要求にあります。ビューに表示するには、これを行う必要があります: https://docs.djangoproject.com/en/dev/ref/contrib/messages/#displaying-messages
また。ブランドンが言うように-メッセージをajax/json呼び出しでも配信したい場合は、それらを「手動で」処理してjson応答に挿入する必要があります。このようなもの:
https://docs.djangoproject.com/en/dev/ref/contrib/messages/#expiration-of-messages
from django.utils import simplejson
feedback = messages.get_messages(request)
for message in feedback:
response[message.tags] = response.get(message.tags, [])
message_text = smart_str(message.message, encoding='utf-8', strings_only=True)
response[message.tags].append(message_text)
return simplejson.dumps(response)
Notification オブジェクトを取得したら、ビュー デコレータを作成してから、表示された通知をユーザーに表示するためのビューを作成するだけです。そのクエリを作成する方法を理解できると確信しています。
この Notification クラスを微調整して、代わりにブール値フィールドを追加するか、relevancy_end_date フィールドを使用することもできます。オンオフをより簡単にするため。
注意!このコードは完全にテストされておらず、おそらくエラーが発生する可能性がありますが、入力から判断すると、その方向に進むためのものです。
アラン