Django报错:无法找到'delete_entry'反向匹配,求解决方案
Django反向解析错误:找不到'delete_entry'的匹配路由
错误说明
报错信息:Reverse for 'delete_entry' with arguments '('',)' not found. 1 pattern(s) tried: ['deleteentry/(?P<input_id>[^/]+)/\Z']
相关代码
views.py
@login_required(login_url='/login') def delete_entry(request, input_id): input=Diary.objects.get(pk=input_id) input.delete() return redirect('home')
urls.py
urlpatterns = [ path('', views.welcome, name='welcome'), path('home', views.home, name='home'), path('MyEntries/', views.MyEntries, name='entries'), path('deleteentry/<input_id>/', views.delete_entry, name='delete_entry'), ]
HTML模板
<p>Hello, {{user.username}} !</p> {% for article in articles %} <p> {{ article.title}}<br> {{ article.description }} <br> {{ article.date }} <div class="card-footer text-muted"> </p> <a href="{% url 'delete_entry' input.id %}" class="delete">Delete</a> </div> {% endfor %} {% endblock %}
问题根源与解决方法
核心问题
模板里循环遍历的变量是article,但你调用{% url %}时传的是input.id,这个变量不存在,导致传入了空值,Django无法匹配需要参数的路由。
修复步骤
把模板中的input.id改成article.id:
<p>Hello, {{user.username}} !</p> {% for article in articles %} <p> {{ article.title}}<br> {{ article.description }} <br> {{ article.date }} <div class="card-footer text-muted"> </p> <a href="{% url 'delete_entry' article.id %}" class="delete">Delete</a> </div> {% endfor %} {% endblock %}
额外优化建议
- 改用POST请求删除:GET请求删除数据不安全,容易被误触发,建议用表单提交:
{% for article in articles %} <!-- 保留原有内容 --> <form action="{% url 'delete_entry' article.id %}" method="POST" style="display: inline;"> {% csrf_token %} <button type="submit" class="delete">Delete</button> </form> {% endfor %}
同时修改视图,仅处理POST请求并捕获异常:
@login_required(login_url='/login') def delete_entry(request, input_id): if request.method == 'POST': try: entry = Diary.objects.get(pk=input_id) entry.delete() except Diary.DoesNotExist: # 处理找不到对象的情况,比如跳转到提示页或直接忽略 pass return redirect('home')
- 捕获对象不存在异常:原视图用
get()方法如果找不到对应ID的数据会抛出异常,加上try-except可以避免页面崩溃。
内容的提问来源于stack exchange,提问作者Hayet
相关产品推荐
相关产品推荐

