Django использует урлы с одинаковым окончанием

У меня есть проект django с приложением web-api и следующей конфигурацией url:

основной проект urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('web-api/', include('webapi.urls')),
]

приложение web-api/urls.py

urlpatterns = [
    path('<param1:param1>/summary', Param1Summary.as_view()),
    path('<param1:param1>/item/<int:id>/summary', ItemView.as_view()),
]

Конечная точка /web-api/param1/summary работает, но /web-api/param1/item/12121/summary не работает и возвращает код состояния 404.

Если я меняю <param1:param1>/item/<int:id>/summary' на <param1:param1>/item/<int:id>/whatever, в web-api/url.py я получаю желаемые результаты.

Я пробовал использовать url regex без успеха.

Есть идеи, как решить проблему?

Заранее спасибо!

Во-первых, "param1" не является допустимым типом url-параметра (смотрите документацию), поэтому вы, вероятно, хотели использовать '<str:param1>/summary' и '<str:param1>/item/<int:pk>/summary'.

Во-вторых, вы должны назвать переменную url "pk", как указано в документации по django здесь, а не "id".

ищет аргументы pk и slug, объявленные в URLConf, и ищет объект либо по атрибуту model в представлении, либо по атрибуту queryset, если он предоставлен

.

Это должно выглядеть следующим образом:

urlpatterns = [
    path('<str:param1>/summary', Param1Summary.as_view()),
    path('<str:param1>/item/<int:pk>/summary', ItemView.as_view()),
]

Альтернативно, вы можете установить pk_url_kwarg = "id" на вашем представлении, чтобы метод get_object() знал, как запрашивать объект. См. в документации

Не общий ответ, но сработал в моем случае.

Изменение порядка ссылок решило проблему. Урлы в web-api/urls.py должны были располагаться в следующем порядке:

urlpatterns = [
    path('<str:param1>/item/<int:pk>/summary', ItemView.as_view()),
    path('<str:param1>/summary', Param1Summary.as_view()),
]

Я не уверен, но вы можете перестроить урлы таким образом и добавить пробелы в именах, чтобы вы могли вызывать их из html шаблона или из других представлений, а также:

urlpatterns = [
    path('summary/<param1:param1>', Param1Summary.as_view(), name='summary_parm')
    path('summary/<param1:param1>/item/<int:id>', ItemView.as_view(),  name='summary_item'),
]
Вернуться на верх