如何让用户在 Django 中只喜欢/不喜欢帖子一次?
Posted
技术标签:
【中文标题】如何让用户在 Django 中只喜欢/不喜欢帖子一次?【英文标题】:How to make user to Like/Dislike post only for once in Django? 【发布时间】:2019-08-13 06:18:29 【问题描述】:几天前开始学习 Django,但现在我遇到了这个问题。 这是一个博客网站,我目前正在使用喜欢/不喜欢的功能。 现在,经过身份验证的用户可以根据需要多次喜欢同一个帖子。 我想我的模型有问题。 (或者在我看来可能是它的条件) 我将非常感谢您的帮助和澄清! :)
这是我的模型(Post.py):
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Пользователь", related_name='author')
title = models.CharField(max_length=80, verbose_name="Название")
body = models.TextField(verbose_name="Текст публикации")
created = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания")
modified = models.DateTimeField(auto_now=True, verbose_name="Дата обновления")
description = models.CharField(max_length=400,verbose_name = "Описание")
reading_time = models.PositiveSmallIntegerField(verbose_name="Время для чтения в минутах")
likes = models.PositiveIntegerField(default=0)
dislikes = models.PositiveIntegerField(default=0)
users_reaction = models.ManyToManyField(User, blank=True, verbose_name='Реакция юзеров', related_name='react')
我的观点(Post.py):
class UserReactionView(View):
template_name='post.html'
def get(self, request, *args, **kwargs):
post_id = self.request.GET.get('post_id')
post = Post.objects.get(id = post_id)
like = self.request.GET.get('like')
dislike = self.request.GET.get('dislike')
post_user_reactions = Post.objects.filter(user=request.user)
if like and (request.user not in post_user_reactions.all()):
post.likes += 1
post.users_reaction.add(request.user)
post.save()
if dislike and (request.user not in post_user_reactions.all()):
post.dislikes += 1
post.users_reaction.add(request.user)
post.save()
data =
'likes': post.likes,
'dislikes': post.dislikes
return JsonResponse(data)
模板中的jquery块
% block jquery %
<script>
$(document).ready(function()
$('#like').on('click', function(e)
e.preventDefault()
var post_id = post.pk
var like = 'like'
data =
post_id: post_id,
like: like
$.ajax (
type:"GET",
url:"% url 'blog:user_reaction' post.pk%",
dataType: 'json',
data: data,
success: function(data)
$('#liked').html(data.likes)
$('#disliked').html(data.dislikes)
)
)
)
$(document).ready(function()
$('#dislike').on('click', function(e)
e.preventDefault()
var post_id = post.pk
var dislike = 'dislike'
data =
post_id: post_id,
dislike: dislike
$.ajax (
type:"GET",
url:"% url 'blog:user_reaction' post.pk %",
dataType: 'json',
data: data,
success: function(data)
$('#liked').html(data.likes)
$('#disliked').html(data.dislikes)
)
)
)
</script>
% endblock %
【问题讨论】:
【参考方案1】:您的查询错误:
post_user_reactions = Post.objects.filter(user=request.user)
此查询过滤掉request.user
创建的所有帖子。
改成这样:
post_obj = Post.objects.get(id = post_id)
# Now get all the users that reacted to this post.
post_user_reactions = post_obj.users_reaction.all()
if like and (request.user not in post_user_reactions):
...
if dislike and (request.user not in post_user_reactions):
...
【讨论】:
是的,但是当我点击赞按钮时,出现以下错误: post_user_reactions = Post.users_reaction.all() AttributeError: 'ManyToManyDescriptor' object has no attribute 'all' 你有post实例吗?post = Post.objects.get(id=post_id)
。当您有查询集而不是实例时,通常会发生此错误。
def get(self, request, *args, **kwargs): post_id = self.request.GET.get('post_id') post = Post.objects.get(id = post_id)
like = self.request.GET.get('like') dislike = self.request.GET.get('dislike') post_user_reactions = Post.users_reaction.all() if like and (request.user not in post_user_reactions): post.likes += 1 post.users_reaction.add(request.user) post.save()
您查询的是模型而不是实例。 Post
与 post
不同。注意小写的“p”。我建议将post
重命名为post_obj
。也在答案中重命名。
没问题。如果它正确回答了您的问题,您可以接受答案。以上是关于如何让用户在 Django 中只喜欢/不喜欢帖子一次?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mongodb 和 mongoose 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和