匹配n个术语的URL模式

时间:2011-02-28 10:18:28

标签: regex django url django-urls

我正在尝试编写一个Django URL模式,该模式匹配由斜杠分隔的1到n个字符串。它应匹配其中任何一个并将每个术语传递给视图:

  

foo.com/apples
  foo.com/apples/oranges
  foo.com/oranges/apples/lizards/google_android/adama

在Django中,我可以将整个视图作为字符串传递给视图并手动解析,但我很好奇是否有某种正则表达式可以更优雅地执行此操作。

2 个答案:

答案 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参数的列表。