Django错误:'user_workouts'反向解析失败,新增训练无法重定向至用户训练页
解决Django反向解析'user_workouts'失败的问题
问题根源
错误源于两个核心问题:
- 你的URL配置中设置了
app_name = "myapp",反向解析时必须带上命名空间,直接调用'user_workouts'无法匹配到对应路由。 user_workouts视图依赖user_id参数完成查询,你调用redirect('user_workouts')时未传递这个必要参数。
修复步骤
1. 修正redirect语句(核心修复)
在add_workout视图的POST处理分支中,将redirect修改为带命名空间和参数的形式:
return redirect('myapp:user_workouts', user_id=user.id)
这里通过myapp:user_workouts指定命名空间+路由名称,同时传递user_id参数,满足反向解析的要求。
2. 修复GET请求分支的变量未定义问题
原代码中GET请求分支的context = {"workout": workout}会报错,因为workout变量仅在POST分支中定义。可以初始化一个空的Workout实例解决:
# GET请求时初始化空的Workout实例 workout = Workout() context = {"workout": workout} return render(request, "users/add_workout.html", context=context)
3. 优化user_workouts视图的查询逻辑
原查询语句workouts = get_list_or_404(Workout, user=user.id)可以简化为直接传递用户对象,更符合Django外键查询的规范:
workouts = get_list_or_404(Workout, user=user)
修改后的完整代码片段
views.py
# 返回用户所有训练内容的视图 def user_workouts(request, user_id): user = User.objects.get(id=user_id) workouts = get_list_or_404(Workout, user=user) return render(request, "users/workouts.html", {"user": user, "workouts": workouts}) # 创建训练内容的视图 def add_workout(request, user_id): user = get_object_or_404(User, id=user_id) if request.method == "POST": workout_title = request.POST.get("workout") reps = request.POST.get("reps") load = request.POST.get("load") last_update = request.POST.get("last_update") workout = Workout(workout=workout_title, reps=reps, load=load, last_update=last_update, user=user) workout.save() return redirect('myapp:user_workouts', user_id=user.id) # GET请求初始化空实例 workout = Workout() context = {"workout": workout} return render(request, "users/add_workout.html", context=context)
内容的提问来源于stack exchange,提问作者Anass Najam
相关产品推荐
相关产品推荐

