jquery - 如何让用户在 Django 中只喜欢/不喜欢帖子一次?
问题描述
几天前开始学习 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 %}
解决方案
您的查询是错误的:
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):
...
推荐阅读
- jquery - 为什么部署后无法在 github 页面上正确加载文件 resumeData.json?
- yaml - 有条件地退出动作
- javascript - 提交时在反应组件中获取 API
- c# - 为什么语音识别在网页中有效,但在电子中无效
- javascript - 批量删除 discord.js
- ios - TestFlight 的多个开发人员
- arrays - 如何使用 Google 表格的“开始日期”和“结束日期”创建权益曲线?
- mysql - 返回两个日期时间表达式之间的差异
- nginx - 通过 Laravel Forge 服务控制默认 Cache-Control: no-cache, private Nginx/php-fpm7.4 安装
- javascript - 检测一个按钮,然后在 JavaScript 中按下它