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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:03:23