所以我正在尝试呈现具有泛型的页面"提交"。正确配置的创建视图。此 URL 模式呈现良好:
from django.contrib import admin
from django.urls import include, path
from curate import views
urlpatterns = [
path('', views.SetListView.as_view(), name='set_list'),
path('new/', views.ItemListView.as_view(), name='new_list'),
path('<int:pk>/edit', views.ItemEditView.as_view(), name='item_edit'),
path('<int:pk>/delete', views.ItemDeleteView.as_view(), name='item_delete'),
path('submit/', views.SubmitItem.as_view(), name='submit_item'),
path('<slug>/', views.ItemDetailView.as_view(), name='item_detail'),
path('<int:pk>/', views.ItemDeleteView.as_view(), name='item_detailPK'),
path('<slug>/', views.SetDetailView.as_view(), name='set_detail'),
]
但是出于某种原因,如果提交视图位于列表中的其他位置,即如下所示,例如在 ItemDetailView.as_view(( url 下方,则它不会呈现,它只是 404。
from django.contrib import admin
from django.urls import include, path
from curate import views
urlpatterns = [
path('', views.SetListView.as_view(), name='set_list'),
path('new/', views.ItemListView.as_view(), name='new_list'),
path('<int:pk>/edit', views.ItemEditView.as_view(), name='item_edit'),
path('<int:pk>/delete', views.ItemDeleteView.as_view(), name='item_delete'),
path('<slug>/', views.ItemDetailView.as_view(), name='item_detail'),
path('submit/', views.SubmitItem.as_view(), name='submit_item'),
path('<int:pk>/', views.ItemDeleteView.as_view(), name='item_detailPK'),
path('<slug>/', views.SetDetailView.as_view(), name='set_detail'),
]
奇怪的是,ItemDetailView渲染良好 - 这为我页面上的所有项目提供支持?
path('<slug>/', views.ItemDetailView.as_view(), name='item_detail'),
path('submit/', views.SubmitItem.as_view(), name='submit_item'),
当item_detail
高于submit_item
时,对/submit/
的请求与'<slug>/'
匹配,因此请求由ItemDetailView
处理。
您没有带有slug="submit"
的项目,因此给出了 404。
Django URL 解析器使用匹配的第一个 URL 模式。如果第一个匹配项返回 404,它不会尝试其他 URL 模式。
当submit_item
高于item_detail
时,SubmitItem
视图会正确处理/submit/
请求。
这是因为网址模式 - <slug>/
.如果这个模式高于submit
,那么 django 会尝试找到slug=submit
。由于数据库中不存在,因此您会得到404。