bugfix> python > 投稿

ユーザーが投稿を高く評価したときに以前に送信された通知の削除に問題があります。

まず、正常に機能している投稿に関連する「いいね」ボタンがあります。

私の問題私は投稿モデルと類似モデル(多対多の関係)を持っており、ユーザーが投稿を高く評価するためにクリックすると信号が送信されて通知が作成される通知モデルから信号を作成しました。だが同じユーザーの場合、私は論理に苦労しています Unlike 投稿(「いいね」ボタンを2回クリック)で、作成した通知をまったく同じユーザーから削除するためのシグナルを送信したいと思います。

だから現在ここに何が起こっているのですか:

  • ユーザーが「いいね」ボタンをクリックします。ザ・いいねボタンの Like
  • 投稿の作成者に送信される通知
  • 同じユーザーが「いいね」ボタンをもう一度クリックします。ザ・いいねボタンの Unike
  • 何も起こりません
  • 必要な結果:

    1. 投稿が削除されることを希望したという以前に作成者に送信された通知
    2. 私が欲しいのは、投稿が拒否されたときに以前に送信された通知を削除することです

      これがポストモデルに関連する私のModels.pyです:

      class Post(models.Model):
          title = models.CharField(max_length=100, unique=True)
          author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author')
          num_likes = models.IntegerField(default=0, verbose_name='No. of Likes')
          likes = models.ManyToManyField(User, related_name='liked', blank=True)
      
      

      これがviews.pyです:

      class PostDetailView(DetailView):
          model = Post
          template_name = "blog/post_detail.html"
          def get_context_data(self, *args, **kwargs):
              context = super(PostDetailView, self).get_context_data()
              post = get_object_or_404(Post, slug=self.kwargs['slug'])
              total_likes = post.total_likes()
              liked = False
              if post.likes.filter(id=self.request.user.id).exists():
                  liked = True
              post_likes = post.likes.all()
              context["liked"] = liked
              context["post_likes"] = post_likes
              return context
      
      

      Models.pyのように:

      class Like(models.Model):
          user = models.ForeignKey(User, on_delete=models.CASCADE)
          post = models.ForeignKey(Post, on_delete=models.CASCADE)
          value = models.CharField(choices=LIKE_CHOICES, default='Like', max_length=8)
          def user_liked_post(sender, instance, *args, **kwargs):
              like = instance
              if like.value=='Like':
                  post = like.post
                  sender = like.user
                  notify = Notification(post=post, sender=sender, user=post.author, notification_type=1)
                  notify.save()
          def user_unlike_post(sender, instance, *args, **kwargs):
              like = instance
              post = like.post
              sender = like.user
              notify = Notification.objects.filter(post=post, sender=sender, user=post.author, notification_type=1)
              notify.delete()
      post_save.connect(Like.user_liked_post, sender=Like)
      post_delete.connect(Like.user_unlike_post, sender=Like)
      
      

      これがlikeviews.pyです:

      def LikeView(request):
          post = get_object_or_404(Post, id=request.POST.get('id'))
          liked = False
          current_likes = post.num_likes
          user = request.user
          if post.author.id == request.user.id:
              messages.warning(request, 'You can not like you own Post')
          else:
              like, created = Like.objects.get_or_create(user=user, post=post)
              sender = like.user
              if not created:
                  if like.value == 'Like':
                      like.value = 'Unlike'
                      like.user_unliked_post(sender=sender, post=post) <------- My trial
                  else:
                      like.value = 'Like'
              like.save()
          context = {
              'total_likes': post.total_likes,
              'liked': liked,
              'post': post,
          }
          if request.is_ajax:
              html = render_to_string('blog/like_section.html', context, request=request)
              return JsonResponse({'form': html})
      
      

      追加しようとしました user_unlike_post の中に LikeView しかし、私はエラーが発生しています AttributeError: 'Like' object has no attribute 'user_unliked_post'

      前の信号をから削除しようとするのが正しいかどうかはわかりません LikeView

      ユーザーが投稿とは異なるときに送信された以前の通知を削除するにはどうすればよいですか?

    回答 1 件
    • 関数を作成できます delete_notification 次のように。

      def delete_notification(sender, post):
          notify = Notification.objects.filter(post=post, sender=sender, user=post.author, notification_type=1)
          notify.delete()
      
      

      そして、で関数を呼び出します LikeView

      def LikeView(request):
          post = get_object_or_404(Post, id=request.POST.get('id'))
          liked = False
          current_likes = post.num_likes
          user = request.user
          if post.author.id == request.user.id:
              messages.warning(request, 'You can not like you own Post')
          else:
              like, created = Like.objects.get_or_create(user=user, post=post)
              sender = like.user
              if not created:
                  if like.value == 'Like':
                      like.value = 'Unlike'
                      delete_notification(sender, post)
                  else:
                      like.value = 'Like'
              like.save()
          context = {
              'total_likes': post.total_likes,
              'liked': liked,
              'post': post,
          }
          if request.is_ajax:
              html = render_to_string('blog/like_section.html', context, request=request)
              return JsonResponse({'form': html})
      
      

      それがうまくいくことを願っています。

      また、両方が user_liked_post そして user_unlike_post メソッドがありません self あなたの議論 Like モデル。

    あなたの答え