Джанго продвинутые вложенные 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'),

Но обратите внимание, что с этим решением вы не можете иметь категорию и продукт с одинаковым слагом.

Другие вопросы по тегам