Django UpdateView更新成功后如何正确配置页面重定向?
报错根源
你遇到的所有反向解析错误,本质是两个基础使用错误:
reverse/reverse_lazy是根据URL的命名反向生成跳转地址的方法,它不接受直接传入URL路径字符串,只认配置了name的URL标识。- 你的
urls.py里定义了app_name = 'reqs'作为应用命名空间,因此所有同应用下的URL名,在反向解析时必须加reqs:前缀才能被识别,直接写'index'/'update'都会触发“找不到视图/路由”的报错。
另外,第二次尝试里让get_success_url方法返回空值(pass没有返回内容)是逻辑错误:这个方法必须返回一个合法的可跳转路径字符串,返回None时Django会把None转成字符串拼到当前路由后,自然就会生成/reqs/1/None这种无效地址触发404。
方案1:更新成功后跳回记录列表页
不需要额外重写方法,直接修正success_url的写法即可,对应views.py的正确实现:
from django.views.generic import ListView, UpdateView from django.urls import reverse_lazy from .models import Requirement from .forms import RequirementForm class IndexView(ListView): template_name = 'reqs/index.html' context_object_name = 'requirements_list' def get_queryset(self): return Requirement.objects.order_by('subject') class ReqUpdateView(UpdateView): model = Requirement form_class = RequirementForm # 反向解析带命名空间的列表页URL名,不要直接传路径 success_url = reverse_lazy('reqs:index')
方案2:更新成功后跳回当前记录的编辑页
如果需要提交后回到当前的编辑表单页,重写get_success_url时同样要补上URL名的命名空间前缀,之前报Reverse for 'update' not found就是因为漏了这个前缀,正确代码:
from django.urls import reverse class ReqUpdateView(UpdateView): model = Requirement form_class = RequirementForm context_object_name = 'requirement_update' def get_success_url(self): # 从路由参数中拿到当前编辑的记录主键 pk = self.kwargs["pk"] # 带命名空间反向解析编辑页URL,传入对应pk参数 return reverse("reqs:update", kwargs={"pk": pk})
内容的提问来源于stack exchange,提问作者Luís de Sousa
相关产品推荐
相关产品推荐

