Django: сопоставить одно или несколько из набора регулярных выражений с ключевым словом в urlconf
У меня есть представление Django, которое принимает три необязательных ключевых аргумента. Я хочу обработать регулярное выражение для сопоставления возможных URL для этого представления в одну строку. Я хочу правильно структурировать URL.
Пример: моими возможными параметрами являются start, который является int, serial, который представляет собой строку длиной 13, и end, который является другим int.
URL может выглядеть так:
/main/s20130509/e20130510/ABC1234567890
or
/main/s20130509/e20130510/
or
/main/ABC1234567890
Где компоненты с префиксом e и s заканчиваются и начинаются соответственно, а ABC1234567890 - последовательный.
Я хочу вытащить эти значения end, start, serial и передать их в представление как значения start=s20130509 и т. Д.
Прямо сейчас я делаю это, исчерпывающе перечисляя перестановки в отдельных строках, и кажется, что должен быть лучший способ.
Я пытаюсь сделать что-то вроде:
url(r'^base_url/(?P<serial>[^/]{13}|(?P<end>e\d{8})|(?P<start>s\d{8})/*$', view_method),
По сути, логика того, что я хочу сделать, мне ясна; Я хочу получить все экземпляры любого из трех совпадений и передать их как ключевые слова, но не могу найти ресурс, чтобы выяснить синтаксис ReGex, чтобы соответствовать этому.
Какие-нибудь мысли? Я счастлив делать в значительной степени все, что выполняет работу элегантно.
Спасибо за ваше время,
Тим
1 ответ
То, что вы хотите, это:
url(r'^base_url/(?P<serial>[^/]{13}/$', view_method),
с добавлением дополнительных групп для end
а также start
Кваргс, так:
# Optional, non-capturing group surrounding the named group for each (so you don't have to capture the slashes or the "e" or "s"
(?:e(?P<end>\d{8})/)
Затем разрешите до 2 из них в любом порядке:
((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}
Результат:
url(r'^base_url/((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}(?P<serial>[^/]{13})/$', view_method),
Отказ от ответственности, я написал это в этой коробке, так что мне понадобится время, чтобы проверить это и обновить ответ (если это не так).
Обновить:
Действительно, это сработало:) Я подобрал следующее:
http://127.0.0.1:8080/base_url/e77777777/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/1234567890123/
Кварги выглядели так (подняты в исключении из get
метод подкласса View
по запросу со всеми тремя сегментами - конец и / или начало были None
когда не учтено):
{'start': u'88888888', 'serial': u'1234567890123', 'end': u'77777777'}