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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:03:10