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_categories
和 show_product_without_cat
视图的 url 正则表达式相同,因此只有第一次出现的 url 有效。
唯一的解决方案是创建一个中间视图,它将根据 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 分配给此视图:
url(r'^uslugi/(?P<slug>\S+)/$', views.product_or_category,
name='show_product_or_category'),
但请注意,使用此解决方案,您不能拥有具有相同 slug 的类别和产品。
欢迎,
我在尝试进行深层嵌套时遇到问题。 问题是我的菜单有子菜单,子菜单可以有多个类别,这些类别可以有多种服务可用,这些服务可以有多种产品。 为那个特定的东西写 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_categories
和 show_product_without_cat
视图的 url 正则表达式相同,因此只有第一次出现的 url 有效。
唯一的解决方案是创建一个中间视图,它将根据 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 分配给此视图:
url(r'^uslugi/(?P<slug>\S+)/$', views.product_or_category,
name='show_product_or_category'),
但请注意,使用此解决方案,您不能拥有具有相同 slug 的类别和产品。