Django使用DeleteView类视图执行删除操作无法跳转确认页面求助
问题原因
- 核心原因是URL匹配顺序错误,Django的URL路由会从上到下按顺序匹配,你现在的
badge/<int:pk>/delete/路径写在了badge/<int:pk>/<slug:slug>/路径后面,当你访问删除地址时,Django会把路径里的delete识别为slug参数,优先匹配到详情页路由,直接跳转至详情页,根本不会走到删除路由。 - 次要问题:你的Badge模型没有定义slug字段,但详情页路由设置了slug参数,会导致详情页本身的查询逻辑存在隐患。
解决步骤
- 调整urls.py中的路由顺序,把更具体的路由放在前面,模糊的路由放在后面,修改后的urlpatterns如下:
urlpatterns = [ path('badge/', article_views.BadgeListView.as_view(), name='badge_list'), path('badge/add/', article_views.BadgeCreateView.as_view(), name='badge_create'), # 把更新、删除路由放在详情页路由前面 path('badge/<int:pk>/', article_views.BadgeUpdateView.as_view(), name='badge_update'), path('badge/<int:pk>/delete/', article_views.BadgeDeleteView.as_view( template_name='ArticlesApp/badge_confirm_delete.html'), name='badge_confirm_delete'), # 带slug的详情页路由放在最后 path('badge/<int:pk>/<slug:slug>/', article_views.BadgeReadView.as_view(), name='badge_read'), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- 处理slug字段问题,二选一即可:
- 如果你确实需要用slug做路由参数,给Badge模型添加
slug = models.SlugField(max_length=100, unique=True)字段,执行迁移后,在保存Badge实例时自动生成slug值。 - 如果你不需要slug参数,直接把详情页路由里的
<slug:slug>/删除,修改为path('badge/<int:pk>/read/', article_views.BadgeReadView.as_view(), name='badge_read')即可,同时对应调整页面里的详情页跳转链接。
- 如果你确实需要用slug做路由参数,给Badge模型添加
内容的提问来源于stack exchange,提问作者sebajou
相关产品推荐
相关产品推荐

