使用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
相关产品推荐
相关产品推荐

