Меня интересует кто как создает urls для Django.
Больше интересует динамически, чем вручную каждый путь руками писать.
Например в ModelAdmin есть функция get_urls, которая для каждой модели создает свои пути.
Делитесь своим опытом!
def get_urls(self):
from django.conf.urls import patterns, url
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.module_name
urlpatterns = patterns('',
url(r'^$',
wrap(self.changelist_view),
name='%s_%s_changelist' % info),
url(r'^add/$',
wrap(self.add_view),
name='%s_%s_add' % info),
url(r'^(.+)/history/$',
wrap(self.history_view),
name='%s_%s_history' % info),
url(r'^(.+)/delete/$',
wrap(self.delete_view),
name='%s_%s_delete' % info),
url(r'^(.+)/$',
wrap(self.change_view),
name='%s_%s_change' % info),
)
return urlpatterns
Ответ
Посмотрел код. Здесь, на мой взгляд, несколько другой случай, нежели "нежелание писать руками". Так как джанговская админка - динамически подстраивается под зарегистрированные модели, ей необходимо регистрировать urlы таким способом. url(r'^$', wrap(self.changelist_view), name='%s_%s_changelist' % info), В этом коде то, в принципе, и нет динамических url - они все типовые. А их динамичность (то есть зависимость от имени используемой модели в данном случае) находится на один уровень выше (/my_model/ и /my_model/add/). Здесь же регистрируются типовые действия для каждой модели: история действий, добавить, удалить и т. д. Динамичность здесь выражается только в уникальном name, который используется в основном для reverse и создается главным образом, как я понимаю, для ускорения работы этой функции (чтобы не было необходимости в поисках нужной функции проверять ее на каждый регэксп - ну то есть для чего и был придуман этот атрибут: указал имя url - и вперед). Если у вас приложение делает нечто подобное джанговской админке - да, такая динамичность имеет место быть. В ином случае логике не место в url-паттернах, как я и написал в комментарии к вопросу.
Комментариев нет:
Отправить комментарий