【问题标题】:How to pass the result of an URL as a parameter?如何将 URL 的结果作为参数传递?
【发布时间】:2016-05-06 01:37:42
【问题描述】:

我希望能够处理以下网址:

http://mywe/en/my-home/travels/search-results/age-min/18/
http://mywe/en/my-home/travels/search-results/age-min/18/age-max/50/
http://mywe/en/my-home/travels/search-results/town/acapulco

等等,所以它会一直遵循这个模式

'([whatever until a slash]+/[whatever until a slash]+)+/$'

这意味着在正则表达式中:

'([^/]+/[^/]+)+/$'

在 Django 中我正在尝试这个:

'^my-home/travels/search-results/(?P<slug>[a-zA-Z0-9-_]*)/$'

这个网址很好用:

http://mywe/en/my-home/travels/search-results/testtesttest/

当我将[a-zA-Z0-9-_] 替换为[.](应该是“任何字符”)时,它不起作用。我想知道

  • 1 - 为什么它不起作用
  • 2 - “Django 方式”的正则表达式是什么'([^/]+/[^/]+)+/$'

谢谢!

【问题讨论】:

  • 为什么不使用您正确识别的正则表达式作为解决方案?没有特定于 Django 的方式来执行正则表达式。

标签: regex django django-urls


【解决方案1】:

对于第一个问题,'[.]' 不起作用,因为它不表示任何字符,它表示点。对于任何字符,您都应该在 [] 之外使用点。

对于第二个问题:您可以以类似的方式定义 URL,但您无法捕获重复组的所有匹配项,它只会捕获最后一个。这是正则表达式的限制。

但我有两个可能的解决方案:

  1. 在一个捕获组(例如.*)中捕获搜索结果后到您的 urlpattern 末尾的所有内容,并在您的视图中解析它以提取每个可能的值
  2. 在指向该视图的 URL 中定义多个模式。他们甚至可以有相同的名字,例如:

    url(r'^/en/my-home/travels/search-results/([^/]+)/([^/]+)/$', your_view, name="your_url_name"),
    url(r'^/en/my-home/travels/search-results/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$', your_view, name="your_url_name"),
    url(r'^/en/my-home/travels/search-results/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$', your_view, name="your_url_name"),
    

    你甚至可以用小循环帮助自己:

    url(r'^/en/my-home/travels/search-results/', include([
        url('^' + '([^/]+)/([^/]+)/' * (i + 1) + '$', your_view, name="your_url_name"),
        for i in range(10) # how many maximum parameters you want to catch
    ]))
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2015-04-04
    • 2017-08-17
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多