首页 > 解决方案 > 根据属性的值在 Django 项目中使用信号删除通知

问题描述

每次用户向帖子提交“喜欢”按钮时,我都会添加一个通知,被喜欢的帖子的所有者会收到通知,但现在我每次通过不喜欢或喜欢单击按钮时都会收到通知,所以我增加了价值像这样它可以是LikeUnlike

所以,现在在通知中我添加了删除选项,但我有点困惑如何设置删除通知,如果 like 的值为Unlike,以防止收到不需要的通知。

这是帖子models.py

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

这是喜欢的models.py

LIKE_CHOICES = (
    ('Like', 'Like'),
    ('Unlike', 'Unlike')
)


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)
    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
        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)

这是通知models.py

class Notification(models.Model):
    NOTIFICATION_TYPES=((1,'Like'),(2,'Comment'),(3,'Follow'))

    post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name="noti_post", blank=True, null=True)
    sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name="noti_from_user")
    user = models.ForeignKey(User, on_delete=models.CASCADE,related_name="noti_to_user")
    notification_type= models.IntegerField(choices=NOTIFICATION_TYPES)
    text_preview= models.CharField(max_length=90,blank=True)
    date=models.DateTimeField(auto_now=True)
    is_seen=models.BooleanField(default=False)

这是views.py,我评论了我的试用版,因为它不起作用

def ShowNotifications(request):
    user=request.user
    notifications= Notification.objects.filter(user=user).order_by('-date')
    template= loader.get_template('notifications/notifications.html')
    # if Like.value == 'Like':
    #     return Like.user_liked_post
    # if Like.value == 'Unlike':
    #     return Like.user_unlike_post

    context= {
        'notifications':notifications
    }
    return HttpResponse(template.render(context, request))

目前的情况:

  1. 目前当用户点赞时发送通知
  2. 当同一用户不喜欢时,也会发送喜欢通知

所需输出:

  1. 当用户喜欢时发送通知
  2. 当同一用户与之前发送的通知不同时被删除

标签: pythondjango

解决方案


推荐阅读