页面404取决于它在'urlpatterns'中的位置 - 为什么?

问题描述 投票:0回答:2

所以我试图渲染页面'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渲染得很好 - 这为我页面上的所有项目提供了动力?

python django url path url-pattern
2个回答
2
投票
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视图正确处理。


1
投票

这是因为网址模式 - <slug>/。如果这个模式高于submit,那么django试图找到slug=submit。由于数据库中不存在,因此您获得404。

© www.soinside.com 2019 - 2024. All rights reserved.