Конфигурация URL-адреса Django для DRYness

Большинство представлений в моем проекте принимают необязательный параметр имени пользователя и, если он существует, фильтруют наборы запросов, передаваемые в шаблоны для этого пользователя. Так, например:

представление индекса обрабатывает оба следующих шаблона URL:

'^$' # general index page
'^(?P<username>[-\w]+)/$' # index page for the user

'^photos/$' # photo index page
'^(?P<username>[-\w]+)/photos/$' # photos for that user
...

Поскольку существует ряд таких приложений, реализация одной и той же логики путем воспроизведения шаблонов не кажется очень СУХОЙ. Я подумал, что можно рекурсивно включить основной модуль urls.py, поэтому я сделал следующее:

url(r'^(?P<username>[-\w]+)/', include('urls')),

Я полагал, что при включении другого модуля URL-адреса соответствующий шаблон удаляется из пути. Итак, я надеялся, что

'^(?P<username>[-\w]+)/photos/$'

станет

'^photos/$'

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

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

Что бы вы порекомендовали? Я слишком придирчив к СУХОСТИ?

Спасибо, омат


person onurmatik    schedule 28.06.2010    source источник


Ответы (1)


Просто определите регулярное выражение как строку в том же файле и уже используйте конкатенацию строк!

user_regex = r"^(?P<username>[-\w]+)/"

Затем вы можете сделать регулярное выражение '%s/photos$'%user_regex, чтобы регулярное выражение было определено только один раз, очень сухо.

Тем не менее, ваши рассуждения о включении шаблонов urls.py в тег url верны, и я не уверен, почему это не удалось. Может еще какая ошибка?

person lprsd    schedule 29.06.2010
comment
спасибо, это поможет очистить шаблоны, но на самом деле каждое приложение имеет свой собственный файл urls.py, который включен. поэтому для каждого приложения все шаблоны должны быть реплицированы в своем собственном urls.py с их альтернативами, совпадающими с именем пользователя. - person onurmatik; 29.06.2010
comment
помимо повторения, поскольку URL-адреса приложений включены как (r'^photo/', include('photos.urls')), URL-адрес для фотографий пользователей будет /photo/[username]/. - person onurmatik; 29.06.2010