Помогите с захватом фрагмента URL в Django - PullRequest
0 голосов
/ 21 сентября 2011

Я работаю над проектом django и пытаюсь сопоставить URL-адреса в следующей форме:

/ карты / серия / ИМЯ СЕРИИ /

где я пытаюсь захватить ИМЯ СЕРИИ

Моя база urls.py включает в себя:

(r'^cards/', include('cards.urls')),

, а затем мои карты / urls.py включают

(r'^series/(\w+)/$',

Однако регулярное выражение не соответствует (404). Если я жестко закодирую путь следующим образом:

(r'^series/foo/$',

Тогда я могу заставить его совпадать с / cards / series / foo /

Итак, кто-нибудь имеет представление о том, что я делаю неправильно, и почему мое регулярное выражение не ловит / cards / series / SERIES NAME /?

Обновление: регулярное выражение будет соответствовать отдельным словам, но не нескольким. Итак:

/cards/series/FOO/

соответствует, но:

/cards/series/FOO BAR/

или что-либо с пробелом не совпадает.

Обновление: нашел решение здесь:

как убрать специальные символы в django urlpatterns

что:

(r'^series/([\w ]+)/$',

1 Ответ

2 голосов
/ 21 сентября 2011

Вы не можете иметь пробелы в URL.Они должны быть спасены.

http://en.wikipedia.org/wiki/Query_string#URL_encoding

Так что, по сути, не делайте этого.Если пробелы важны, они должны попасть в ваш URL как /cards/series/SERIES%20NAME/.В наши дни лучше использовать дефисы, хотя подчеркивания тоже подойдут.Использование заглавных букв является законным, но некоторые люди (например, я) будут иметь плохую форму.

Что касается того, почему шаблон не работает, шаблоны запросов Django являются регулярными выражениями:

http://en.wikipedia.org/wiki/Regular_expression

Вы захватываете схему \w+\w является заменой для Alphanumeric characters plus "_", в то время как последующее + говорит, что соответствует one or more of the preceding element.Пробел не является буквенно-цифровым символом, поэтому, если вы хотите сопоставить пробелы, вам нужно добавить его в набор, который вы нашли.Скобки используются для обозначения набора допустимых символов, поэтому [\w ]+ будет означать Alphanumeric characters plus "_" plus " "

Опять же, не делайте этого.

...