如何将 URL 的结果作为参数传递?
How to pass the result of an URL as a parameter?
我希望能够处理如下 URL:
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-_]*)/$'
这个url工作正常:
http://mywe/en/my-home/travels/search-results/testtesttest/
当我将 [a-zA-Z0-9-_]
替换为 [.]
(应该是 "any character")时,它不起作用。我想知道
- 1 - 为什么它不起作用
- 2 - "Django way" 的正则表达式是什么
'([^/]+/[^/]+)+/$'
谢谢!
对于第一个问题,'[.]'
不起作用,因为它不代表任何字符,它代表点。对于任何字符,您应该在 []
.
之外使用点
对于第二个问题:你可以用类似的方式定义URL,但是你不能捕获重复组的所有匹配项,它只会捕获最后一个。那是正则表达式的限制。
但我为您提供了 2 种可能的解决方案:
- 在一个捕获组(例如
.*
)中捕获搜索结果后到 urlpattern 末尾的所有内容,并在您的视图中对其进行解析以提取每个可能的值
在指向该视图的 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
]))
我希望能够处理如下 URL:
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-_]*)/$'
这个url工作正常:
http://mywe/en/my-home/travels/search-results/testtesttest/
当我将 [a-zA-Z0-9-_]
替换为 [.]
(应该是 "any character")时,它不起作用。我想知道
- 1 - 为什么它不起作用
- 2 - "Django way" 的正则表达式是什么
'([^/]+/[^/]+)+/$'
谢谢!
对于第一个问题,'[.]'
不起作用,因为它不代表任何字符,它代表点。对于任何字符,您应该在 []
.
对于第二个问题:你可以用类似的方式定义URL,但是你不能捕获重复组的所有匹配项,它只会捕获最后一个。那是正则表达式的限制。
但我为您提供了 2 种可能的解决方案:
- 在一个捕获组(例如
.*
)中捕获搜索结果后到 urlpattern 末尾的所有内容,并在您的视图中对其进行解析以提取每个可能的值 在指向该视图的 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 ]))