You need to enable JavaScript to run this app. Django UpdateView更新成功后如何正确配置页面重定向?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 01:06:09