【问题标题】:Django advanced nesting urlsDjango 高级嵌套网址
【发布时间】:2015-02-26 17:22:06
【问题描述】:

欢迎,

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

例如:

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 视图。更改这些 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>

【问题讨论】:

    标签: django url overlap nested


    【解决方案1】:

    URL 调度程序找到第一个匹配请求路径的 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 的类别和产品。

    【讨论】:

    • 感谢您的友好回复。我设法创建了一个更简单的嵌套。我在最基本的链接mysite.com/product 中展示了我的产品,没有分类我在前一晚都在与这个斗争......我所需要的只是睡眠和新鲜的头脑。我也试过你的解决方案,它工作得很好。祝你有个愉快的一天,我的朋友。
    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2012-05-05
    相关资源
    最近更新 更多