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'),
]