属性错误:'str'对象没有属性'likes'



我正在尝试获取与帖子相关的点赞数,因此我创建了以下内容:帖子模型:

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服务器错误

最新更新