Django博客点赞按钮报错ValueError:无效整数字面量问题求助
问题分析与解决方案
嘿,我来帮你搞定这个点赞按钮的错误!
错误原因
你遇到的ValueError: invalid literal for int() with base 10: 'uien-jdhn-fds',核心原因非常明确:
在LikeView里的这行代码:
post = get_object_or_404(BlogPost, id=request.POST.get('blog_post_slug'))
BlogPost的id字段是Django自动生成的整数类型,但你传入的request.POST.get('blog_post_slug')是字符串格式的slug值(比如'uien-jdhn-fds'),Django尝试把这个字符串转成整数时自然会失败,就抛出了这个错误。
修改方案
方案1:直接修正查询字段(最快速的修复)
把查询条件里的id改成slug,因为你传入的是slug值,应该匹配对应的slug字段:
修改后的完整LikeView代码:
def LikeView(request, slug): context = {} # 将id改为slug,匹配传入的字符串slug值 post = get_object_or_404(BlogPost, slug=request.POST.get('blog_post_slug')) if post.likes.filter(id=request.user.id).exists(): post.likes.remove(request.user) else: post.likes.add(request.user) # 修正跳转参数:用实例post的slug,而非类字段BlogPost.slug return HttpResponseRedirect(reverse('HomeFeed:detail', args=[str(post.slug)]))
方案2:利用URL中的slug参数(更简洁规范)
其实你的LikeView已经从URL路径(<slug>/like/)获取到了slug参数,完全可以直接用这个参数查询,不用从POST里取,代码会更简洁:
def LikeView(request, slug): context = {} # 直接使用URL传入的slug参数查询文章 post = get_object_or_404(BlogPost, slug=slug) if post.likes.filter(id=request.user.id).exists(): post.likes.remove(request.user) else: post.likes.add(request.user) # 直接用slug参数跳转详情页 return HttpResponseRedirect(reverse('HomeFeed:detail', args=[slug]))
这种情况下,你的表单代码可以保留原样,也可以去掉name="blog_post_slug"和value="{{blog_post.slug}}",因为已经不需要从POST传递slug了。
额外注意点
你原来的返回语句reverse('HomeFeed:detail',args=[str(BlogPost.slug)])有个小错误:BlogPost.slug是类的字段,不是具体实例的属性,必须用你查询到的post实例的post.slug,否则会触发新的错误。
内容的提问来源于stack exchange,提问作者user14820658
相关产品推荐
相关产品推荐

