欢迎,
我有一个问题,我试图深入嵌套。 问题是我的菜单中有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>
答案 0 :(得分:0)
网址调度程序找到与请求路径匹配的第一个网址,并调用找到的视图。您对show_categories
和show_product_without_cat
视图都具有相同的网址正则表达式,因此只有第一次出现的网址才有效。
唯一的解决方案是创建一个中间视图,该视图将针对Category
或Product
模型检查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的类别和产品。