Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将Django项目中的信号通知限制为模型中的特定属性_Python_Django_Django Signals - Fatal编程技术网

Python 将Django项目中的信号通知限制为模型中的特定属性

Python 将Django项目中的信号通知限制为模型中的特定属性,python,django,django-signals,Python,Django,Django Signals,我已经添加了一个通知,每当用户向帖子提交Like按钮时,Like帖子的所有者就会收到一个通知 我已将每个Like按钮的值选项设置为Like或inspect,因此现在我试图限制仅当单击Like按钮的值为Like时才发送通知 因此,现在在Like模型中,我添加了信号和一个条件,如果Like.value==Like信号激活,但由于某种原因,它不工作,我不确定为什么 我的问题是: 如何将通知信号设置为仅在Like.value==Like时发送 以下是post models.py: 以下是like mod

我已经添加了一个通知,每当用户向帖子提交Like按钮时,Like帖子的所有者就会收到一个通知

我已将每个Like按钮的值选项设置为
Like
inspect
,因此现在我试图限制仅当单击Like按钮的值为
Like
时才发送通知

因此,现在在Like模型中,我添加了信号和一个条件,如果Like.value==
Like
信号激活,但由于某种原因,它不工作,我不确定为什么

我的问题是:

如何将通知信号设置为仅在Like.value==
Like
时发送

以下是post models.py:

以下是like models.py:

这是notifications models.py

以下是views.py:


在post_save处理程序中,比较如下
if Like.value==“Like”:

但是
Like
是一个类,其中
value
是一个字段,因此比较永远不会
True

    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\u liked\u post
是模型上的一种方法。因此,它期望的第一个参数是
self
。但是post save处理程序将其用作类方法。但是由于
发件人
可能是
cls
,因此
Like

现在运行良好,但由于某些原因,当创建新帖子并单击Like按钮时,发送了2个通知,而不是仅发送1个,您知道原因是什么吗?@a_K,很抱歉我的回复太晚了。我不是每天的访客。但信号处理器可能连接了两次。Django在加载时做了一些奇怪的事情。我喜欢在连接信号时使用dispatch\u uid。有关详细信息,请参阅
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):
        if Like.value=='Like':
            like = instance
            post = like.post
            sender = like.user
            notify = Notification(post=post, sender=sender, user=post.author, notification_type=1)
            notify.save()
        else:
            None

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