Шаблон URL для соответствия n терминам - PullRequest
0 голосов
/ 28 февраля 2011

Я пытаюсь написать шаблон URL Django, который соответствует от 1 до n строк, разделенных косой чертой.Он должен соответствовать любому из них и передавать каждый термин в представление:

foo.com / яблок
foo.com/apples/oranges
foo.com/oranges/apples/lizards/ google_android / adama

В Django я мог просто передать всю вещь в представление в виде строки и разобрать ее вручную, но мне было любопытно, есть ли какое-нибудь регулярное выражение, чтобы сделать это более элегантно.

Ответы [ 2 ]

4 голосов
/ 28 февраля 2011

Регулярное выражение всегда будет соответствовать одной подстроке, а не нескольким строковым частям, поэтому вы не сможете получить список вместо одного совпадения.

Вы должны разобрать слова вручную:

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 голос
/ 28 февраля 2011

С несколькими аргументами, вероятно, проще использовать параметры GET, чем анализировать URL.При необходимости они автоматически преобразуются в список:

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

с urlconf, равным всего лишь:

(r'^$', myView),

в представлении, которое вы только что сделали:args теперь будет списком всех параметров arg.

...