bugfix> python > 投稿

ユーザーが「いいね」ボタンを投稿に送信するたびに、「いいね」の投稿の所有者が通知を受け取るという通知を追加しました。

「いいね」ボタンごとに「いいね」または「いいね」の値オプションを設定しました。クリックした「いいね」の値が「いいね」のみの場合にのみ通知を送信するように制限しました。

そのため、Likeモデルにシグナルを追加し、Like.value == Likeの場合はシグナルがアクティブになるが、何らかの理由で、新しい投稿が作成され、新しいユーザーが「いいね」をクリックした場合にのみ2回送信されるという条件を追加しました。初めて、その後、彼がユニケして再び好きなら、それは一度送られます。

私の質問は:

新しいユーザーが「いいね」ボタンをクリックするたびに信号が複製されるのはなぜですか? それを修正する方法は?

これが投稿models.pyです:

class Post(models.Model):
    title = models.CharField(max_length=100, unique=True)
    likes = models.ManyToManyField(User, related_name='liked', blank=True)

これがLikemodel.pyです

LIKE_CHOICES = (
    ('Like', 'Like'),
    ('Unlike', 'Unlike')
)
class Like(models.Model):
    # To know Who liked
    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)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now=True)
    def __str__(self):
        return f"{self.post}-{self.user}-{self.value}"
    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()
# Likes
post_save.connect(Like.user_liked_post, sender=Like)
post_delete.connect(Like.user_unlike_post, sender=Like)

これがviews.pyです:

def ShowNotifications(request):
    user=request.user
    notifications= Notification.objects.filter(user=user).order_by('-date')
    template= loader.get_template('notifications/notifications.html')
    context= {
        'notifications':notifications
    }
    return HttpResponse(template.render(context, request))

回答 1 件
  • あなたはこの方法を試すことができます:

    from django.db import models
    from django.db.models.signals import post_save, post_delete
    from django.contrib.auth.models import User
    from django.dispatch import receiver
    # Create your models here.
    class Post(models.Model):
        title = models.CharField(max_length=100, unique=True)
        author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post_author')
        def __str__(self):
            return self.title
    class Like(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        post = models.ForeignKey(Post, on_delete=models.CASCADE)
        created = models.DateTimeField(auto_now_add=True)
        def __str__(self):
            return f"{self.post.title}@_{self.user}"
    @receiver(post_save, sender=Like)
    def user_liked_post(sender, instance, created, *args, **kwargs):
        try:
            if created:
                notify = Notification(
                    post=instance.post,
                    sender=instance.user,
                    user=instance.post.author,
                    notification_type=1
                )
                notify.save()
        except Exception as e:
            print('Error sending liked notification!')
            print(e)
    @receiver(post_delete, sender=Like)
    def user_unlike_post(sender, instance, *args, **kwargs):
        try:
            notify = Notification.objects.filter(
                post=instance.post,
                sender=instance.user,
            )
            notify.delete()
        except Exception as e:
            print('Error deleting liked notification!')
            print(e)
    
    

    いいねしたレコードを削除しているので、レコードのステータスは決してなりません unlike そしてその updated フィールドも更新されません。 したがって、更新フィールドと値フィールドをから削除します Like モデル。

    そして、以下の行であなたはフェッチしています author から Post モデルですが、著者フィールドがありません Post モデル。

    notify = Notification(post=post, sender=sender, user=post.author, notification_type=1)
    
    

あなたの答え