我正在尝试获取与帖子相关的点赞数,因此我创建了以下内容:帖子模型:
class Post(models.Model):
title = models.CharField(max_length=100, unique=True)
likes = models.IntegerField(default=0)
我已经能够获得点赞数量,但我正在尝试一种不同的方法,我只是想知道这种方法是如何工作的。
以下是我在点赞时尝试添加的视图
def like_post(request):
user = request.user
post = request.POST.get('post_id')
current_likes = post.likes <------------Error coming from here
if request.method == 'POST':
post_obj = Post.objects.get(id=post)
if user in post_obj.liked.all():
post_obj.liked.remove(user)
current_likes = current_likes - 1
else:
post_obj.liked.add(user)
current_likes = current_likes + 1
post.likes=current_likes
post.save()
like, created = Like.objects.get_or_create(user=user, post_id=post)
if not created:
if like.value == 'Like':
like.value = 'Unlike'
else:
like.value = 'Like'
like.save()
context = {
'post': post,
}
return redirect('blog:post-detail', slug=post_obj.slug)
现在的问题是我正在接收
AttributeError at /blogs/like
'str' object has no attribute 'likes'
我试过修理它,但我不知道。此处突出显示错误源:
current_likes = post.likes
这个部分没有多大意义:
post = request.POST.get('post_id')
current_likes = post.likes
if request.method == 'POST':
post_obj = Post.objects.get(id=post)
因为在检查请求方法是否为POST
之前,您正在访问request.POST
。更改为:
if request.method == 'POST':
post = request.POST.get('post_id')
post_obj = Post.objects.get(id=post)
current_likes = post_obj.likes
post
不是Post
对象,它只是映射在post_id
键上的str
。您可以使用`get获取相应的Post
对象
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_http_methods
@require_http_methods(['POST'])
def like_post(request):
user = request.user
post =get_object_or_404(Post, pk=request.POST.get('post_id'))
current_likes = post.likes
# …
在视图的后面部分,您当然不需要再次获取Post
对象。
如果也允许GET请求,那么最好将主键编码在URL中,而不是POST请求中,因为您也可以发出GET请求,然后post_id
就会丢失。
因此,URL通常为:
urlpatterns = [
path('/blogs/like/<int:pk>', like_post, name='like')
]
然后在like_post
视图中:
from django.shortcuts import get_object_or_404
def like_post(request, post_id):
user = request.user
post =get_object_or_404(Post, pk=post_id)
current_likes = post.likes
# …
注意:通常最好使用
get_object_or_404(…)
[Django-doc],然后直接使用.get(…)
[Django-doc]。在对象不存在的情况下,例如,由于用户自己更改了URL,get_object_or_404(…)
将导致返回HTTP404NotFound响应,而使用.get(…)
将导致HTTP 500服务器错误。