Django urlpatterns, включающие / в задней части
Я студент, изучающий Django.
У меня есть вопрос, и я был бы признателен, если бы кто-нибудь помог мне.
Когда я перехожу по адресу 127.0.0.1:8000/feeds/1, он правильно отображает фид с идентификатором 1.
Однако при переходе по адресу 127.0.0.1:8000/reviews/1 я сталкиваюсь с проблемой, и получаю следующую ошибку: страница не найдена
Эту проблему можно решить, добавив косую черту в разделе пути к файлу reviews/urls.py, как это показано ниже: "int:review_id/".
Мой вопрос: почему URL фидов работает без косой черты в urlpatterns, а для обзоров я должен включить косую черту, чтобы он работал?
здесь находится основной urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path("admin/", admin.site.urls),
path("feeds/", include('feeds.urls')),
path("users/", include('users.urls')),
path("reviews/",include('reviews.urls'))
# path("boards/", include('boards.urls'))
]
# feeds/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.Feeds.as_view()),
path("<int:feed_id>",views.FeedDetail.as_view())
]
# reviews/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.Reviews.as_view()),
path("<int:review_id>/", views.ReviewDetail.as_view())
]
Ответ находится прямо перед вами. Из вашего кода:
path(
"<int:feed_id>", # <-- Notice no trailing '/'
views.FeedDetail.as_view())
path(
"<int:review_id>/", # <-- Notice trailing '/'
views.ReviewDetail.as_view())
Или, другими словами, если вы поместили '/' в конце объявления пути, '/' должно быть там же, когда вы вводите свой URL.
Вы не включили косую черту в:
path("<int:feed_id>",views.FeedDetail.as_view())
но вы сделали это в:
path("<int:review_id>/", views.ReviewDetail.as_view())
Предыстория: Когда пользователь запрашивает страницу, Django перебирает все шаблоны URL по порядку и останавливается на первом, который соответствует запрашиваемому URL, сопоставляя его с path_info. Как только один из шаблонов URL совпадает, Django импортирует и вызывает данное представление, которое представляет собой функцию Python (или представление на основе класса). Важно отметить, что URL, запрашиваемый пользователем, должен совпадать с URL, заданным в списке urlpatterns (включая косые черты).
Кроме того, я посоветую вам включить параметр name в ваши urlpatterns. Параметр name в шаблонах URL используется для присвоения уникального имени каждому URL. Он позволяет вам ссылаться на URL по его имени вместо того, чтобы жестко кодировать URL в коде. Это облегчает поддержку и обновление URL в проекте. См. https://docs.djangoproject.com/en/5.0/topics/http/urls/#reverse-resolution-of-urls