Django实现带URL参数页面重定向报错问题解决
Django带URL参数重定向报错修复
你代码里的报错来自4处写法错误,逐一修正即可:
- 模板反向解析传参名和路由定义不匹配:模板里写的参数名是
id,路由里定义的参数名是uid,直接触发NoReverseMatch错误 - 表单HTML结构错误:
<form>标签放在for循环内部,提交按钮放在循环外部,按钮不属于任何表单,点击无法提交 - 用户更新逻辑错误:新建
AddContact实例直接赋值主键id保存,无法正确更新已有用户数据,还会触发主键冲突 - 重定向方法调用错误:
reverse()传参格式错误、redirect()错误传入request作为第一个参数、直接写模板文件名无法完成路由跳转
修正后的代码
1. 模板文件调整
如果是列表中每个用户对应独立编辑表单,把表单和提交按钮都放在for循环内部,同时修正url标签的参数名:
{% for vr in adduser.adduser.all %} <form method="POST" action="{% url 'edituser' uid=vr.id bid=adduser.id %}"> {% csrf_token %} <label for="FirstName">First Name<span style="color:#ff0000">*</span></label> <input type="text" class="form-control" name="firstname" placeholder="Type FirstName here...." value="{{vr.f_name}}"> <label for="LastName">Last Name<span style="color:#ff0000">*</span></label> <input type="text" class="form-control" name="lastname" placeholder="Type LastName here...." value="{{vr.l_name}}"> <button type="submit" class="btn btn-primary">保存修改</button> </form> {% endfor %}
2. 路由配置调整
给路径参数加上int类型转换器,避免字符串类型id触发查询错误,同时确认目标跳转路由adduser也配置了bid参数接收:
# urls.py from django.urls import path from . import views urlpatterns = [ # 编辑用户路由,加int转换器 path('edituser/<int:uid>/<int:bid>', views.edituser, name="edituser"), # 目标跳转的广播列表页路由,必须配置bid参数接收,否则重定向会报错 path('adduser/<int:bid>', views.adduser, name="adduser"), ]
3. 视图函数修正
修正用户更新逻辑,调整重定向的参数传递写法:
# views.py from django.shortcuts import redirect from django.contrib import messages from .models import AddContact def edituser(request, uid, bid): if request.method == "POST": firstname = request.POST.get('firstname') lastname = request.POST.get('lastname') if firstname and lastname: # 取出要编辑的已有用户记录,不要新建模型实例 saverecord = AddContact.objects.get(id=uid) saverecord.f_name = firstname saverecord.l_name = lastname saverecord.save() # 带路径参数重定向,redirect直接支持传路由关键字参数 return redirect('adduser', bid=bid) messages.error(request, "编辑联系人失败,请填写所有必填项") return redirect('adduser', bid=bid) # GET非法请求直接跳回对应列表页 messages.error(request, "非法访问请求") return redirect('adduser', bid=bid)
补充说明:如果你要传递的是
?bid=xxx格式的GET查询参数,不是路径参数,需要手动拼接查询串,写法为redirect(f"{reverse('adduser')}?bid={bid}")
内容的提问来源于stack exchange,提问作者Iron Man
相关产品推荐
相关产品推荐

