所以我试图渲染页面'submit',它有一个正确配置的generic.CreateView。此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
时,对/submit/
的请求由SubmitItem
视图正确处理。
这是因为网址模式 - <slug>/
。如果这个模式高于submit
,那么django试图找到slug=submit
。由于数据库中不存在,因此您获得404。