【问题标题】:django urls variable number of parametersdjango urls 可变参数个数
【发布时间】:2011-07-28 11:43:08
【问题描述】:

我想知道 Django 中是否有一种方法可以让 url 在 / 之后允许多个参数,它们的数量是可变的。

这是我的意思的一个例子:

因此,如果我有一个名为 about us 的页面,其 url /page/about_us 那么我有一个链接到 about us 的页面,称为联系信息,它的 url 是否是 /page/about_us/contact_info 可能在它下面有另一个页面和以此类推。

您将如何编写 URL 处理以允许 /page 后跟任意数量的其他带有斜线的页面?这似乎对于做面包屑之类的事情很有用,而且还会使网址非常易读。我只是不知道如何制作正则表达式或可以将路径中的可变编号页作为参数的视图。

最好只使用一个正则表达式来捕获 /page/ 之后的所有内容作为一个长参数,然后让视图通过在 / 处拆分来分解它?这样的正则表达式会是什么样子?我似乎无法在没有问题的情况下在正则表达式中包含 /。

【问题讨论】:

    标签: django django-views django-urls


    【解决方案1】:

    使用您的 urls.py 执行此操作的一种方法是使用 $ 终止您的正则表达式或查看您的 url 添加的顺序。

    例如:

    url(r'^page/about_us/$', 'example.views.about_us', name='about_us'),
    url(r'^page/about_us/contact_info/$', 'example.views.contact_info', name='contact_info'),
    url(r'^page/about_us/contact_info/map/$', 'example.views.map', name='map'),
    

    可以正常工作。也会:

    url(r'^page/about_us/contact_info/map/', 'example.views.map', name='map'),
    url(r'^page/about_us/contact_info/', 'example.views.contact_info', name='contact_info'),
    url(r'^page/about_us/', 'example.views.about_us', name='about_us'),
    

    但这不会让您访问除 about_us 页面以外的页面:

    url(r'^page/about_us/', 'example.views.about_us', name='about_us'),
    url(r'^page/about_us/contact_info/', 'example.views.contact_info', name='contact_info'),
    url(r'^page/about_us/contact_info/map/', 'example.views.map', name='map'),
    

    在最后一个示例中,如果您的站点位于 www.example.com,而您转到 www.example.com/page/about_us/,您将到达 about_us 视图。但是,如果您访问 www.example.com/page/about_us/contact_us/,您仍然会到达 about_us 视图。这是因为如果您的正则表达式不以 $ 结尾,它将匹配以您的表达式开头的任何内容并重定向您。

    按顺序检查 url,因此如果您不使用 $ 并且正确添加了 url 的顺序,您仍然会到达正确的页面,就像在第二个 url 块中一样。

    【讨论】:

    • 我还发现我可以使用这个正则表达式:(r'^page/(?P.+)', 'mypageview')。它将匹配以 /page 开头的任何内容。此外,/page 之后的整个块作为单个参数传递给视图。然后我可以分解它并在视图中处理它。因此,如果 url 是 /page/about_us/contact/,我会在视图中将“/about_us/contact”作为一个称为 slug 的参数。然后我在 / 处拆分以细化页面遍历。我认为这会奏效并且非常灵活。
    猜你喜欢
    • 2015-11-16
    • 2011-04-29
    • 2019-02-10
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多