Django反向解析showuser路由传参不匹配报错如何解决
Django
showuser路由反向解析报错修复方案 报错信息
Reverse for 'showuser' with keyword arguments '{'bid': 1}' not found. 1 pattern(s) tried: ['showuser/(?P
[0-9]+)\Z']
错误原因
共3处代码问题直接触发报错:
- 模板
{% url %}标签语法错误:int:是urls.py专属的路径类型转换器,模板标签内不需要写;且传参名和路由定义的参数名不匹配,路由要求参数名为broadcastid,实际传入的是bid,直接导致反向解析匹配失败。 - 视图层重定向方法使用错误:
HttpResponseRedirect仅接收目标路径字符串作为入参,不支持直接传入模板上下文字典;硬编码路径名做跳转也容易出现匹配异常。 - 路由定义不规范:路径末尾未加斜杠,和Django默认的
APPEND_SLASH配置逻辑冲突,容易触发不必要的301重定向。
对应修复代码
1. 修正urls.py路由
补全路径尾部斜杠,保持参数名不变:
# urls.py from django.urls import path from . import views urlpatterns = [ path('showuser/<int:broadcastid>/', views.showuser, name="showuser"), ]
2. 修正adduser.html模板标签
删除多余的int:前缀,保证参数名和路由定义的broadcastid完全一致:
<!-- adduser.html --> <a href="{% url 'showuser' broadcastid=adduser.id %}" class="btn btn-primary"> Add Existing User </a>
*注意:此处传入的adduser.id必须是主表BroadcastListSms的主键值,如果当前模板上下文里的adduser是AddContact外键对象,需要替换为adduser.broadcast_list_id取关联主表ID,否则会传错参数值。
3. 修正views.py重定向逻辑
用reverse方法反向解析目标路径,不要给重定向方法传模板字典:
# views.py from django.shortcuts import render from django.urls import reverse from django.http import HttpResponseRedirect from .models import BroadcastListSms, AddContact def showuser(request, broadcastid): vrbrlstnm = BroadcastListSms.objects.get(id=broadcastid) showDepartment = AddContact.objects.values('dept_nm').distinct() if request.method == "GET": select_val = request.GET.get('select') if select_val == "All": departmentData = AddContact.objects.all() else: departmentData = AddContact.objects.filter(dept_nm=select_val) return render(request, "showuser.html", { 'adduser': vrbrlstnm, 'showDepartment': showDepartment, 'departmentData': departmentData }) # POST逻辑处理完成后重定向回对应页面,通过reverse生成正确路径 return HttpResponseRedirect(reverse('showuser', kwargs={'broadcastid': broadcastid}))
修改完成后重启Django服务,报错即可解决。
内容的提问来源于stack exchange,提问作者user19350831
相关产品推荐
相关产品推荐

