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

Django中company_delete路由反向匹配失败及500错误排查求助

解决Django的NoReverseMatch与500错误

嘿,我来帮你搞定这个问题!你遇到的django.urls.exceptions.NoReverseMatch错误,本质是在生成company_delete的URL时传了空的pk参数(错误提示里的('',)就是证据),Django找不到对应的路由,进而触发了500服务器错误。结合你的代码,问题主要出在两个地方:

一、删除模板的变量名用错了

看你的company_delete.html模板,里面写了{% url 'company_delete' c.pk %},但回头看views.py的company_delete视图:

else:
    context = {'company': company}
    data['html_form'] = render_to_string('company_delete.html',context,request=request)

这里传递给删除模板的上下文变量是company,不是c!c是company_list_2.html里循环遍历公司列表的变量,在删除模板里根本不存在,所以c.pk会返回空值,直接导致反向匹配失败。

而且模板里的{{ c.name }}也会有同样的问题,删除确认框里的公司名称会显示为空。

二、URL配置里的转义字符坑

你的urls.py里的路由写了(?P&lt;pk&gt;\d+),这明显是HTML转义后的结果(<变成了&lt;,>变成了&gt;),Django根本解析不了这个参数,这也是反向匹配失败的潜在原因。


解决方案

1. 修复company_delete.html的变量名

把模板里所有的c替换成company,修改后代码如下:

{% load crispy_forms_tags %}
<form method="post" data-url="{% url 'company_delete' company.pk %}" class="delete-form">
 {% csrf_token %}
 <div class="modal-header">
 <h3 class="modal-title">Delete Company</h3>
 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
 <span aria-hidden="true">&times;</span>
 </button>
 </div>
 <div class="modal-body">
 <p class="lead">Are you sure you want to delete this company <strong>{{ company.name }}</strong>?</p>
 </div>
 <div class="modal-footer">
 <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
 <button type="submit" class="btn btn-danger">Delete Company</button>
 </div>
</form>

2. 修正urls.py的路由转义问题

把所有&lt;和&gt;替换成正常的<和>,修改后的urlpatterns:

urlpatterns = [
    url(r'^company/$', views.company_list, name='company_list'),
    url(r'^company/create/$', views.company_create, name='company_create'),
    url(r'^company/(?P<pk>\d+)/update/$', views.company_update, name='company_update'),
    url(r'^company/(?P<pk>\d+)/delete/$', views.company_delete, name='company_delete'),
]

3. 额外验证点

  • 确认你的Company模型主键是pk(Django默认会自动生成id作为主键,pk是它的别名,所以一般没问题,除非你自定义了主键字段)。
  • 检查company_list_2.html里的{% url 'company_delete' c.pk %}是正常的,这里的c是循环变量,有有效的pk值,不用改。

做完这些修改后,重启你的Django开发服务器,再试试删除功能,应该就能正常工作了!

内容的提问来源于stack exchange,提问作者mtr khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:33:11