Django博客提交评分后无法跳转至下一篇待评分博客问题求助
问题根因排查
1. 反向路由解析错误直接原因
你的urls.py中定义的路由参数名为blog_id,但跳转时传的关键字参数是pk或者rate_blog_post,参数名不匹配,所以Django无法找到对应路由触发报错。
2. 未评分博客获取逻辑错误
- 原有
next_blog = Blog.objects.filter(rate__ratings=None)逻辑错误,只会筛选出没有任何用户评分的博客,如果某篇博客被其他用户评过、但当前登录用户没评过,会被直接漏掉,不符合需求 filter返回的是多条结果的查询集,没有取单条实例,无法直接用于跳转- 原视图存在变量名错误:
post.blog = data中的data未定义,应该是当前请求的博客对象obj - 模板路径缺少引号,会触发语法错误
修正后的完整代码
1. views.py 修正
from django.db.models import Exists, OuterRef def rate_blog_post(request, blog_id): current_blog = get_object_or_404(Blog, pk=blog_id) if request.method == 'POST': form = Form(data=request.POST) if form.is_valid(): post = form.save(commit=False) post.user = request.user post.blog = current_blog # 修正未定义的data变量 post.save() # 查找当前用户未评分的第一篇博客 next_blog = Blog.objects.filter( ~Exists(Rate.objects.filter( user=request.user, blog=OuterRef('pk') )) ).order_by('pk').first() # 可自行更换排序规则,比如按创建时间排序 if next_blog: # 路由参数名必须和urls定义一致,使用blog_id return redirect('rate_blog_post', blog_id=next_blog.id) else: # 无待评分博客时的兜底跳转,可替换为你的自定义路由 return redirect('home') else: form = Form() context = {'obj': current_blog, 'form': form} # 修正模板名缺少引号的问题 return render(request, 'rate_blog_post.html', context)
2. urls.py 无需修改,保持原有配置即可
path('rate_blog_post/<int:blog_id>/', views.rate_blog_post, name='rate_blog_post'),
关键说明
- 用
Exists子查询筛选当前用户未评分的博客,逻辑更准确、查询性能更高 - 跳转时必须严格匹配路由定义的参数名,不能随意更换为
pk等其他名称 - 增加了所有博客评完后的兜底跳转逻辑,避免空指针报错
内容的提问来源于stack exchange,提问作者user16885260
相关产品推荐
相关产品推荐

