【问题标题】:URL pattern to match n terms匹配 n 个术语的 URL 模式
【发布时间】:2011-07-05 16:05:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex django url django-urls


    【解决方案1】:

    一个正则表达式总是匹配一个子字符串,而不是多个字符串部分,所以你不可能得到一个列表而不是一个匹配。

    您应该手动解析单词:

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

    【讨论】:

    • 我怀疑是这样。谢谢,然后手动解析 - 我想这还不错。
    【解决方案2】:

    使用多个参数,使用 GET 参数可能比解析 URL 更容易。这些会在必要时自动转换为列表:

    http://foo.com/?arg=apple&arg=orange&arg=lizard
    

    与刚才的urlconf:

    (r'^$', myView),
    

    在你刚刚做的视图中:

    args = request.GET.getlist('arg')
    

    args 现在将是所有arg 参数的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2019-03-29
      相关资源
      最近更新 更多