I ahve a django project with the application web-api
and the following url configuration:
main project urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('web-api/', include('webapi.urls')),
]
application web-api/urls.py
urlpatterns = [
path('<param1:param1>/summary', Param1Summary.as_view()),
path('<param1:param1>/item/<int:id>/summary', ItemView.as_view()),
]
The /web-api/param1/summary
endpoint works but /web-api/param1/item/12121/summary
does not work and returns a 404 status code.
If I change the <param1:param1>/item/<int:id>/summary'
to <param1:param1>/item/<int:id>/whatever
, in the web-api/url.py
I get the desired results.
I have tried using url regex without succees.
Any ideas on how to solve the problem?
Thanks in advance!
CodePudding user response:
Not an general answer but worked in my case.
Changing the order of the urls solved the issue. The urls in web-api/urls.py
had to be in the following order:
urlpatterns = [
path('<str:param1>/item/<int:pk>/summary', ItemView.as_view()),
path('<str:param1>/summary', Param1Summary.as_view()),
]
CodePudding user response:
I'm not sure but you can reorder the urls in this way and add name spaces so you can call them from html template or from other views as well:
urlpatterns = [
path('summary/<param1:param1>', Param1Summary.as_view(), name='summary_parm')
path('summary/<param1:param1>/item/<int:id>', ItemView.as_view(), name='summary_item'),
]
CodePudding user response:
First, "param1" is not a valid url parameter type (see the docs), so you probably wanted to use '<str:param1>/summary'
and '<str:param1>/item/<int:pk>/summary'
.
Second, you should name the url variable "pk" as mentioned in django docs here, and not "id".
it looks for pk and slug keyword arguments as declared in the URLConf, and looks the object up either from the model attribute on the view, or the queryset attribute if that’s provided
It should look like this:
urlpatterns = [
path('<str:param1>/summary', Param1Summary.as_view()),
path('<str:param1>/item/<int:pk>/summary', ItemView.as_view()),
]
Alternatively, you can set the pk_url_kwarg = "id"
on your view to let the get_object()
method know how to query for the object. See in the docs