Python 将Django项目中的信号通知限制为模型中的特定属性
我已经添加了一个通知,每当用户向帖子提交Like按钮时,Like帖子的所有者就会收到一个通知 我已将每个Like按钮的值选项设置为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
或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()