让Django URL忽略额外参数
我有一个 Django 的 URL 规则,内容如下:
url(r'^site/(?P<site_level>[\S]+)/$', site_details, name='site_details'),
这个规则可以处理网址 http://127.0.0.1:8000/site/level1/
,在这种情况下,site_level
的值会是 level1
。
但是,如果用户输入像 http://127.0.0.1:8000/site/level1/some-dummy-text
这样的地址,site_level
的值就会变成 level1/some-dummy-text
。
有没有办法通过修改当前的 URL 正则表达式,来忽略 site_level
变量后面的无用值,也就是这段文字 /some-dummy-text
?
(url(r'^site/(?P<site_level>[\S]+)/$', site_details, name='site_details'),
)
还是说我每次处理这个变量的时候,都得手动检查一下?
2 个回答
0
也许你应该修改一下你的正则表达式,避免使用'/'这个字符:
url(r'^site/(?P<site_level>\w+)/(?P<garbage>)\S*)$',
site_details, name='site_details'),
1
你现在用的正则表达式是 [\S]+,这个表达式的意思是匹配任何数量的非空白字符。这个过程叫做“贪婪匹配”,也就是说它会一直匹配到URL的最后,包括斜杠和后面的所有内容。所以它会一直匹配到位置的最后,没什么奇怪的。
你应该把正则表达式改成不那么贪婪的,或者只匹配非斜杠的字符。这样如果遇到斜杠,它就会把后面的部分分开,作为位置的下一部分。
url(r'^site/(?P<site_level>[^\/]+)/', site_details, name='site_details'),
注意,我还去掉了匹配行尾的$符号。你可能想要添加一个第二个模式,以匹配你site_level后面的其余部分。