Django URL с параметром не работает с include

Я пытаюсь передать параметр в url перед оператором include. Я думаю, что моя проблема должна быть похожа на эту, но я не могу понять, почему моя не работает. Я получаю ошибку NoReverseMatch at /womens/ Reverse for 'shampoo' with arguments '('womens',)' not found. 1 pattern(s) tried: ['(?P<gender>womens|mens)/items/shampoo/$']

*config.urls*
urlpatterns = [
    re_path(r'(?P<gender>womens|mens)/items/$, include('items.urls')),
    ...
]
*items.urls*
urlpatterns = [
    path('shampoo', views.shampoo, name='shampoo'),
    path('soap', views.soap, name='soap'),
    ...
]
{% url 'items:shampoo' gender='male' %}

я ожидаю получить male/items/shampoo, но это не работает. Несмотря на это, я все еще могу вручную перейти к male/items/shampoo.

Это может работать, когда вы делаете это вручную, как male/items/shampoo, но поскольку это дает ошибку NoReverseMatch, Django не может найти подходящий шаблон URL, который вы предоставили и который включает параметры.

После некоторого изучения этого вопроса выяснилось, что при использовании {% url 'items:shampoo' gender='male' %} может происходить нечто подобное. Предполагая, что вы запускаете это на локальном хосте, вы ожидаете, что URL будет выглядеть как male/items/shampoo. Этот url говорит, посмотрите в мужском разделе, среди товаров покажите шампунь. Но вы передаете параметр не в том месте. {% url 'items:shampoo' gender='male' %} означает, что параметр male передается в URL, который имеет пространство имен shampoo. URL с пространством имен shampoo не принимает никаких параметров.

Можно попробовать изменить ваш код следующим образом.

*config.urls*
urlpatterns = [
    re_path(r'^$', include('items.urls')),
    ...
]
from django.conf.urls import url, path
*items.urls*
urlpatterns = [
    url(r'^(?P<gender>\w+)/items/shampoo/$', views.shampoo, name='shampoo'),
    path('soap', views.soap, name='soap'),
    ...
]
Вернуться на верх