Django 高级嵌套 url

Django advanced nesting urls

欢迎,

我在尝试进行深层嵌套时遇到问题。 问题是我的菜单有子菜单,子菜单可以有多个类别,这些类别可以有多种服务可用,这些服务可以有多种产品。 为那个特定的东西写 urls 很容易,但是当我试图创建一个没有类别的产品并且我希望它直接显示在 SUBMENU 中时,问题在于为那个特定的东西写 url与 SUBMENU slug 不重叠的产品。

例如:

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 因为 django 将尝试执行 show_product_without_cat

我有没有重新设计所有结构的合理解决方案?

不幸的是,即使在模板中告诉 django 调用特定的 VIEW 也无济于事。它只是遍历所有 url 并匹配第一个

<a href="{% url 'show_product_without_cat' i.url  %}" >
                    <img src="/media/{{ i.image }}"> <br/>
                </a>

URL dispatcher 找到第一个匹配请求路径的 url 并调用找到的视图。 show_categoriesshow_product_without_cat 视图的 url 正则表达式相同,因此只有第一次出现的 url 有效。

唯一的解决方案是创建一个中间视图,它将根据 CategoryProduct 模型检查 slug 并调用适当的视图。

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'),

但请注意,使用此解决方案,您不能拥有具有相同 slug 的类别和产品。