我正在尝试编写一个Django URL模式,该模式匹配由斜杠分隔的1到n个字符串。它应匹配其中任何一个并将每个术语传递给视图:
foo.com/apples
foo.com/apples/oranges
foo.com/oranges/apples/lizards/google_android/adama
在Django中,我可以将整个视图作为字符串传递给视图并手动解析,但我很好奇是否有某种正则表达式可以更优雅地执行此操作。
答案 0 :(得分:4)
正则表达式将始终匹配一个子字符串,而不是多个字符串部分,因此您无法获得列表而不是单个匹配。
您应该手动解析单词:
urlpatterns = patterns('',
(r'^(?P<words>\w+(/\w+)*)/$', myView),
)
def myView(request, words):
# The URL path /a/b/ will give you the output [u'a', u'b']
return HttpResponse(str(words.split("/")))
根据您的使用案例,每个单词可能具有固定含义,例如日期或产品类别。然后你可以将它们中的一些选择性如下:
urlpatterns = patterns('',
(r'^(?P<year>\d\d\d\d)/((?P<month>\d\d)/((?P<day>\d\d)/)?)?$', myView),
)
def myView(request, year, month, day):
# URL path /2010/ will output year=2010 month=None day=None
# URL path /2010/01/ will output year=2010 month=01 day=None
# URL path /2010/01/01/ will output year=2010 month=01 day=01
return HttpResponse("year=%s month=%s day=%s" % (year, month, day))
答案 1 :(得分:1)
使用多个参数,使用GET参数而不是解析URL可能更容易。这些会在必要时自动转换为列表:
http://foo.com/?arg=apple&arg=orange&arg=lizard
使用urlconf:
(r'^$', myView),
在视图中你只是这样做:
args = request.GET.getlist('arg')
和args
现在将是所有arg
参数的列表。