Django先进的嵌套网址

时间:2015-02-26 09:06:20

标签: django url overlap nested

欢迎,

我有一个问题,我试图深入嵌套。 问题是我的菜单中有SUBMENU,可以有多个类别,这些类别可以提供多种服务,这些服务可以有多种产品。 为特定事物编写网址很容易,但是当我尝试创建一个没有类别的产品并且我希望它直接显示在SUBMENU时,问题在于为与SUBMENU slug不重叠的特定产品编写网址。 / p>

例如:

MENU > SUBMENU1 > CATEGORY 1 > AVAILABLE SERVICES > PRODUCT 1
MENU > SUBMENU2 
MENU > SUBMENU3 > PRODUCT 2

所有这些名字都是slugged,我的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'),

问题是当我尝试输入没有类别的产品(只是放在子菜单中)时,我的网址正在调用show_category视图。更改这些网址的顺序无法解决我的问题,因为我无法输入show_categories因为django会尝试执行show_product_without_cat

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

不幸的是,甚至在模板中用django来调用特定的VIEW也没有任何帮助。它只是通过所有网址并匹配第一个

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

1 个答案:

答案 0 :(得分:0)

网址调度程序找到与请求路径匹配的第一个网址,并调用找到的视图。您对show_categoriesshow_product_without_cat视图都具有相同的网址正则表达式,因此只有第一次出现的网址才有效。

唯一的解决方案是创建一个中间视图,该视图将针对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(r'^uslugi/(?P<slug>\S+)/$', views.product_or_category,
                                name='show_product_or_category'),

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