2016-05-08 16 views
2

私はコードを覚えて、私に動機を与え続けるライブDjangoプロジェクトを持っています。私のDjangoアプリケーションでは、ユーザーはコメントを残し、他の人はコメントに返信します。簡単なユーザ通知システムを処理するためのDjangoシグナル

ユーザーがホームページを更新するたびに、以前のコメントに新しい返信を受け取ったかどうかを計算し、通知があれば計算します。

ユーザーが1トンのコメントを残して1トンの返信を受け取った場合、計算にはのlurkersのコンテンツを作成しないユーザーよりも時間がかかります。これらのコンテンツ制作者の経験を向上させたいと思います。

deeper into itを読むと、私はDjangoの信号が行く方法だと考えました。たとえば、新しい返信が残るたびにpost_save()シグナルを発生させることができます。このシグナルは受信してユーザの通知を更新します。このようにして、返信が残っているときに通知が更新されます。

私は自分のコードをリファクタリングする必要がありますが、私はまだ上記の実装上の詳細についてはぼんやりしています。誰も私に、私は上記を達成する方法の簡単な説明の例を提供することはできますか?それは私を始めさせるだろう。


現在、ユーザーの応答処理は、私のviews.py class PublicreplyView(CreateView)にCBVのform_valid方法で処理されます。私は私のCBVのメソッドとして以下を含めることができると推測していますか?

from django.db.models.signals import post_save post_save.connect(form_valid, sender=User)

そして他の場所で、私は、彼らがホームページを更新したら、すべてのユーザーに対して通知を処理異なるCBVを持っています。私はそれを完全に書き直す必要があると思いますか?私が言ったように、私はその前にぼんやりとしています。

わかりやすく簡単な例を教えてもらいたいと思います。ありがとう!


p.s.私はDjangoにいます< 1.8。

+1

これは良い質問ですが、非常に幅広く、おそらく広すぎるかもしれません。問題の説明を読むと、何か不足しているように思えます。ページが表示されるたびに通知を計算したくない場合は、それらを保存する必要があります。これは、あなたのpost_saveで、DBのどこかにユーザーのための通知を保存/更新することを意味します。彼がホームページを見たとき、DBの同じ値を更新(減少)します。 – Djizeus

+0

@Djizeus:CBVの 'form_valid'メソッドに' post_save'をどう使っていますか?あれは正しいですか? –

答えて

3

@Djizeusは彼のコメントで良い概要を示しました。完全な例をお伝えします。私は、通知のために別々のモデルを作成し、コメント作成時にpost_saveシグナルを使ってそれらを作成します。しかし、私は有効なフォームにこのコードをフックしないでくださいコメントモデルでpost_save信号を使用します。このようにして、コードをより明確に分離できます。たとえば、モバイルやデスクトップ上のさまざまなフォームや、PublicreplyViewをリファクタリングする場合は、信号コードに触れる必要はありません。

コメントを保存すると、Djangoはpost_save信号を既に起動しているので、それらを聴いて処理するだけです。これを行うには、signals.pyファイルを作成してください:

from django.dispatch import receiver 
from django.db.models.signals import post_save 
from .models import Comment, Notification 

@receiver(post_save, sender=Comment) 
def auto_create_notification(sender, instance, created, **kwargs): 
    if created: 
     # instance holds the new comment (reply), but you also have to fetch 
     # original comment and the user who created it 
     parent_comment = instance.parent_comment 
     parent_user = parent_comment.user    
     Notification.objects.create(user=parent_user, 
            comment=parent_comment, 
            type="reply_created") 

この信号をフックするには、さらに2つのファイルを作成/編集する必要があります。あなたのapps.pyにこれを追加します。

from django.apps import AppConfig 

# change Comment with your app name 
class CommentConfig(AppConfig): 

    name = 'comment' 
    verbose_name = 'Comment' 

    def ready(self): 
     import comment.signals 

は、あなたの__init__.pyにこれを追加します。

default_app_config = 'comment.apps.CommentConfig' 

自分のホームページのビューの実装に関しては、それはあなたが自分のホームページに表示何をすべきかによって決まります。通知のみを表示する場合は、Notification ListViewを使用することをお勧めします。異なるコンテンツが混在している場合は、おそらくTemplateViewを使用して、get_context_data()メソッドで表示する必要があるすべてのコンテンツを取得します。

関連する問題