Django中edit_server_request反向解析失败问题排查求助
解决Django中NoReverseMatch错误(edit_server_request路由问题)
问题描述
访问路径/en/dashboard/server-request/时触发NoReverseMatch错误,提示内容如下:
Reverse for 'edit_server_request' with arguments '(2,)' not found. 1 pattern(s) tried: ['en/dashboard/edit-server-request/int:pk']
模板中触发错误的编辑、删除按钮代码:
<td> <a class="edit-button" href="{% url 'dashboard:edit_server_request' user.server_user.pk %}">{% trans 'Edit' %}</a> <a class="delete-button" href="{% url 'dashboard:delete_server_request' user.server_user.pk %}">{% trans 'Delete' %}</a> </td>
相关代码
views.py
def edit_server_request(request, pk): server_request = get_object_or_404(ServerRequest, pk=pk) if request.method == "POST": form = ServerRequestForm(request.POST, instance=server_request) if form.is_valid(): form.save() return redirect('server_request_list') else: form = ServerRequestForm(instance=server_request) context = {'form': form} return render(request, 'dashboard/school/edit_server_request.html', context) def delete_server_request(request, pk): server_request = get_object_or_404(ServerRequest, pk=pk) server_request.delete() return redirect('server_request_list')
urls.py
url(r'edit-server-request/<int:pk>', school_views.edit_server_request, name='edit_server_request'), url(r'delete-server-request/<int:pk>', school_views.delete_server_request, name='delete_server_request')
问题根源
你在urls.py里混用了Django两种不兼容的路由写法:旧版正则路由函数url()和新版路径转换器<int:pk>。url()函数只识别正则表达式语法,无法解析<int:pk>这种路径转换器,导致模板里的{% url %}标签无法反向生成正确的URL,最终抛出匹配错误。
修复方案
两种方法选其一即可:
方法一:改用正则表达式写法(适配旧版Django)
把路径转换器替换为正则分组捕获语法:
url(r'edit-server-request/(?P<pk>\d+)/$', school_views.edit_server_request, name='edit_server_request'), url(r'delete-server-request/(?P<pk>\d+)/$', school_views.delete_server_request, name='delete_server_request')
(?P<pk>\d+):正则分组,捕获数字类型的pk参数,命名和视图函数的参数名保持一致- 末尾加
/$:确保匹配完整的URL路径,避免部分匹配引发的异常
方法二:改用path()函数(推荐,Django 2.0+)
如果你的Django版本是2.0及以上,推荐用新版path()函数,原生支持路径转换器:
from django.urls import path path('edit-server-request/<int:pk>/', school_views.edit_server_request, name='edit_server_request'), path('delete-server-request/<int:pk>/', school_views.delete_server_request, name='delete_server_request')
path()是Django官方推荐的路由写法,语法更直观简洁- 末尾保留
/,符合Django的URL规范
额外检查项
- 确认模板中
user.server_user.pk是有效的数字值,避免传递空值或非数字导致解析失败 - 检查视图中
redirect('server_request_list')的路由名称是否正确,确保反向解析不会出错
内容的提问来源于stack exchange,提问作者Anee Mes
相关产品推荐
相关产品推荐

