Джанго продвинутые вложенные URL
Добро пожаловать,
У меня проблема, когда я пытаюсь сделать глубокое вложение. Дело в том, что у меня есть Меню с SUBMENU, которое может иметь несколько категорий, и в этих категориях может быть доступно несколько услуг, и эти услуги могут иметь несколько продуктов. Написание URL для этой конкретной вещи было легко, но когда я пытаюсь создать продукт, у которого нет категории, и я хочу, чтобы он отображался непосредственно в SUBMENU, проблема заключается в написании URL для этого конкретного продукта, который не пересекается со слагом SUBMENU.
Например:
MENU > SUBMENU1 > CATEGORY 1 > AVAILABLE SERVICES > PRODUCT 1
MENU > SUBMENU2
MENU > SUBMENU3 > PRODUCT 2
все эти имена включены, и мой urls.py выглядит так:
url(r'^uslugi/(?P<category_slug>\S+)/(?P<services_slug>\S+)/(?P<service>\S+)/$', views.show_service_details, name='show_service_details'),
url(r'^uslugi/(?P<category_slug>\S+)/(?P<services_slug>\S+)/$', views.show_services, name='show_services'),
url(r'^uslugi/(?P<category_slug>\S+)/$', views.show_categories, name='show_categories'),
url(r'^uslugi/(?P<product_slug>\S+)/$', views.show_product_without_cat, name='show_product_without_cat'),
Дело в том, что когда я пытаюсь ввести товар без категории (просто помещенный в подменю), мои URL-адреса вызывают show_category
Посмотреть. Изменение последовательности этих URL не решит мою проблему, потому что я не смогу ввести свой show_categories
потому что Джанго будет пытаться выполнить show_product_without_cat
У меня есть разумное решение для этого без перестройки всей структуры?
К сожалению, даже сказать django в шаблоне для вызова определенного VIEW не поможет вообще. Он просто проходит через все URL и соответствует первому
<a href="{% url 'show_product_without_cat' i.url %}" >
<img src="/media/{{ i.image }}"> <br/>
</a>
1 ответ
Диспетчер URL-адресов находит первый URL-адрес, соответствующий пути запроса, и вызывает найденное представление. У вас есть одинаковое регулярное выражение URL для обоих show_categories
а также show_product_without_cat
просмотры, поэтому будет работать только первое вхождение URL.
Единственное решение состоит в том, чтобы создать промежуточный вид, который будет проверять слизняк против Category
или же Product
модель и назовите соответствующий вид.
def product_or_category(request, slug):
if Product.objects.filter(slug=slug).exists():
return show_product_without_cat(request, slug)
return show_categories(request, slug)
И присвойте URL этому представлению:
url(r'^uslugi/(?P<slug>\S+)/$', views.product_or_category,
name='show_product_or_category'),
Но обратите внимание, что с этим решением вы не можете иметь категорию и продукт с одинаковым слагом.