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

使用Django UpdateView类出现404页面未找到问题求助

问题排查与代码优化方案

1. 页面找不到(404)的核心原因

你的URL配置中,更新视图的路径是actualizar_empleado/<int:pk>,必须携带员工的pk(主键)参数才能匹配规则。你访问的actualizar_empleado/没有传递pk值,所以Django找不到对应的URL映射。

正确的访问路径应为类似actualizar_empleado/1/(假设员工主键为1)。如果从列表页跳转,建议用URL反向解析生成带pk的链接:

<a href="{% url 'updatemp' employee.pk %}">编辑员工</a>

2. 代码中的其他问题与最佳实践

(1)表单提交方法错误

HTML表单不支持直接使用PUT方法,Django处理更新请求需用POST方法,可添加隐藏字段模拟PUT(或直接用POST,UpdateView默认支持POST处理更新):

<form method="POST" action="." enctype="multipart/form-data">
    {% csrf_token %}
    <!-- 可选:模拟PUT方法的隐藏字段 -->
    <input type="hidden" name="_method" value="PUT">
    <table>{{ form.as_table }}</table>
    <input type="submit" value="Actualizar">
</form>

(2)硬编码URL的优化

所有success_url使用硬编码路径不利于维护,应改用reverse_lazy(类视图必须用lazy版本,避免URL配置未初始化时出错):

from django.urls import reverse_lazy

class EmployeeCreate(CreateView):
    form_class = EmployeeForm
    template_name = 'employeeCreate.html'
    success_url = reverse_lazy('listemp')  # 通过URL名称反向解析

class EmployeeUpdate(UpdateView):
    # ...其他配置
    success_url = reverse_lazy('listemp')

(3)冗余代码删除

DetailView和UpdateView默认已通过pk参数获取对象,你重写的get_object方法完全多余,直接删除:

# 删掉以下冗余代码
def get_object(self):
    id_ = self.kwargs.get("pk")
    return get_object_or_404(EmployeesInfo, pk=id_)

(4)无效配置清理

ListView和DetailView不支持success_url属性,相关配置无意义,直接删除:

class EmployeeList(ListView):
    model = EmployeesInfo
    template_name = 'employeeList.html'
    # 删除该行:success_url = 'lista-empleados/exitoso'

class EmployeeDetail(DetailView):
    model = EmployeesInfo
    template_name = 'employeeDetail.html'
    # 删除该行:success_url = 'detalle-empleado/exitoso'

(5)代码规范优化

  • Views.py中重复导入了ListView,删除多余的导入行:
from django.views.generic import (
    CreateView,
    DetailView,
    ListView,
    UpdateView,
    # 删掉该行重复的ListView
    # ListView,
    DeleteView
)
  • URLs.py中统一路径结尾斜杠,保持一致性:
path('lista_empleados/', EmployeeList.as_view(), name='listemp'),
path('detalle_empleado/<int:pk>/', EmployeeDetail.as_view(), name='showemp'),
path('actualizar_empleado/<int:pk>/', EmployeeUpdate.as_view(), name='updatemp'),

(6)UpdateView配置简化

UpdateView无需指定queryset,设置model = EmployeesInfo即可,与其他通用视图保持一致:

class EmployeeUpdate(UpdateView):
    form_class = EmployeeForm
    model = EmployeesInfo  # 替换原queryset配置
    template_name = 'employeeUpdate.html'
    success_url = reverse_lazy('listemp')

内容的提问来源于stack exchange,提问作者Juan Camilo Gravina Coy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:01:12