Оказалось что решить проблему все таки придется т.к это важно для поисковиков
Сейчас сделано вот таким образом
url(r'^catalog/(?P<slug>[-\w]+)/$', views.catalog, {'type_list': u'catalog'}, name='default_catalog'),
url(r'^catalog/(?P<slug>[-\w]+)/-/(?P<subcategory_slug>[-\w]+)/$', views.catalog, {'type_list': u'catalog'}, name='default_catalog_subcategory'),
url(r'^catalog/(?P<category_slug>[-\w]+)/(?P<slug>[-.\w]+)/$', views.product, name='default_product'),
Вот так выглядят урлы на сайте
http://www.sport2000.ru/catalog/begovye-dorozhki/ #Категория
http://www.sport2000.ru/catalog/begovye-dorozhki/-/elektricheskiye/ #Подкатегория
http://www.sport2000.ru/catalog/begovye-dorozhki/proform-730zlt/ #Продукт
Подкатегории выполняют роль быстрого фильтра, т.е один товар может находиться в нескольких подкатегориях одновременно.
Если сделать урл продукта вида /catalog/КАТЕГОРИЯ/ПОДКАТЕГОРИЯ/ПРОДУКТ
то поисковики накажут за дубли страниц, т.к один продукт будет доступен по нескольким урлам.
В идеале, если урлы будут такие
url(r'^catalog/(?P<slug>[-\w]+)/(?P<subcategory_slug>[-\w]+)/$', views.catalog, {'type_list': u'catalog'}, name='default_catalog_subcategory'),
url(r'^catalog/(?P<category_slug>[-\w]+)/(?P<slug>[-.\w]+)/$', views.product, name='default_product'),
/catalog/КАТЕГОРИЯ/ПОДКАТЕГОРИЯ
/catalog/КАТЕГОРИЯ/ПРОДУКТ
Во вьюхе продукт получаю так
def product(request, category_slug = False, slug=False):
obj_product = get_object_or_404(Product, slug = slug)
Подкатегория так же достается. Соответсвенно, в каком бы порядке в urls.py я эти строчки не прописал я буду ловить 404 либо для подкатегорий либо для продуктов.
Единственным решением я вижу вариант такой. Если в методе продукта Product.object.get(slug = slug)
ничего не находит, из метода продукта вызывать метод подкатегории. Но это некрасиво и сложно в поддержке в будущем.