如何将URL的结果作为参数传递?

时间:2016-01-28 15:29:44

标签: regex django django-urls

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

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]+)+/$'

这意味着在regexp:

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

在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-_]替换为[.](应该是&#34;任何字符&#34;)时它不起作用。我想知道

  • 1 - 为什么它不起作用
  • 2 - &#34; Django方式&#34;是什么样的正则表达式?做'([^/]+/[^/]+)+/$'

谢谢!

1 个答案:

答案 0 :(得分:0)

对于第一个问题,'[.]'不起作用,因为它并不意味着任何字符,它意味着点。对于任何字符,您应该使用[]之外的点。

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

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

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

    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
    ]))