Django 2中reverse无法找到视图:新建应用重定向失败问题
Django Create视图无法重定向到Detail视图的排查方案
嘿,我太懂这种明明感觉是个简单问题但就是卡壳的抓狂感了!你说现有应用都正常,新应用的create视图死活跳不到detail,但手动输ID又能访问,那说明detail视图本身是没问题的,问题肯定出在重定向的URL生成逻辑或者URL反向解析的配置上,咱们一步步来排查:
1. 先检查Create视图里的重定向代码
这是最常见的坑:
- 你是不是没带命名空间?因为你的urls.py里设置了
app_name = 'service',所以用reverse或者redirect的时候必须加上命名空间前缀,比如应该写成reverse('service:detail', kwargs={'pk': new_obj.pk}),而不是只写reverse('detail')——Django会找不到对应的URL,甚至可能悄悄跳去其他应用的同名视图! - 确认你是不是正确拿到了新创建对象的PK?比如得先调用
form.save()保存对象,再用返回的实例拿pk,而不是用表单里的临时值(比如form.cleaned_data['id'],这时候ID还没生成呢)。 - 别漏了
return!有时候写了redirect(...)但忘了加return,视图最后会默认返回模板响应,自然不会重定向。
举个正确的Create视图示例:
from django.shortcuts import render, redirect from django.urls import reverse from .forms import ServiceForm def create(request): if request.method == 'POST': form = ServiceForm(request.POST) if form.is_valid(): # 先保存对象,拿到实例 new_service = form.save() # 带命名空间反向解析,传递pk参数 return redirect(reverse('service:detail', kwargs={'pk': new_service.pk})) else: form = ServiceForm() return render(request, 'service/create.html', {'form': form})
2. 检查URL配置里的Detail视图
你贴的urls.py片段只写到了create视图,得确认detail视图的路径是不是正确配置了:
- 有没有给detail视图的URL指定
name?比如path('<int:pk>/', views.detail, name='detail')——name参数是反向解析的关键,没它的话reverse根本找不到目标URL。 - URL里的参数是不是和视图里的参数匹配?比如URL里用
<int:pk>,视图里就得接受pk参数,不能写成id或者别的名字,不然反向解析会报错。
补全后的urls.py应该是这样:
from django.urls import path from . import views app_name = 'service' urlpatterns = [ path('', views.create, name='create'), # 必须有name和正确的pk参数 path('<int:pk>/', views.detail, name='detail'), ]
3. 看看控制台的错误日志
运行Django的时候,留意一下终端里的输出,如果有NoReverseMatch异常,那直接就能定位问题——比如提示找不到service:detail,或者缺少pk参数,照着提示改就行。也可以在create视图里加个打印语句,看看生成的URL对不对:
# 在重定向之前加一行 print(reverse('service:detail', kwargs={'pk': new_service.pk}))
看看输出的URL是不是和你手动输入的一致,比如是不是/service/1/这种格式。
最后快速排查点
- 有没有可能是表单验证没通过?比如create视图里表单无效的时候,直接返回了表单页面,你以为是重定向失效,其实根本没走到重定向的逻辑——可以在表单里加个错误提示,或者打印
form.errors看看。
内容的提问来源于stack exchange,提问作者Carl Brubaker
相关产品推荐
相关产品推荐

