You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:36:04