Страница 404 в зависимости от ее положения в «urlpatterns» - почему? - PullRequest
0 голосов
/ 24 апреля 2019

Итак, я пытаюсь отобразить страницу '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'),
]

Но по какой-то причине, если представление Submit находится в другом месте списка, то есть, как показано ниже, как в приведенном ниже URL-адресе ItemDetailView.as_view (), оно выиграет 'это всего лишь 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 прекрасно рендерится - это приводит в действие все элементы на моей странице?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019
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.

Средство распознавания URL Django использует первый соответствующий шаблон URL.Он не пробует другие шаблоны URL, если первое совпадение возвращает 404.

Когда submit_item выше item_detail, запрос к /submit/ корректно обрабатывается представлением SubmitItem.

1 голос
/ 24 апреля 2019

Это из-за шаблона URL - <slug>/. Если этот шаблон выше submit, тогда django пытается найти slug=submit. И так как этого нет в базе данных, вы получите 404.

...