django urls 参数数量可变

Jon*_*Jon 2 django django-urls django-views

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

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

因此,如果我有一个名为“关于我们”的页面,其网址为 /page/about_us,那么我有一个从“关于我们”链接的页面,称为“联系信息”,它的网址是否为 /page/about_us/contact_info,其下可能有另一个页面,依此类推。

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

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

DTi*_*ing 5

使用 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'),
Run Code Online (Sandbox Code Playgroud)

会正常工作。所以会:

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'),
Run Code Online (Sandbox Code Playgroud)

但这不会让您到达 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'),
Run Code Online (Sandbox Code Playgroud)

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

url 会按顺序检查,因此,如果您确实省略了 url 的顺序,$并且适当地添加了 url 的顺序,您仍然会到达正确的页面,如第二个 url 块中所示。

  • 我还发现我可以使用这个正则表达式:(r'^page/(?P<slug>.+)', 'mypageview')。它将匹配以 /page 开头的任何内容。此外,/page 之后的整个块作为单个参数传递给视图。然后我可以将其分解并在视图中处理它。因此,如果网址是 /page/about_us/contact/ 我会在视图中得到“/about_us/contact”作为名为 slug 的参数。然后我在 / 处将其拆分以优化页面遍历。我认为这会起作用并且非常灵活。 (3认同)