#python #django
Меня интересует кто как создает 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
Ответы
Ответ 1
Посмотрел код. Здесь, на мой взгляд, несколько другой случай, нежели "нежелание писать руками". Так как джанговская админка - динамически подстраивается под зарегистрированные модели, ей необходимо регистрировать urlы таким способом. url(r'^$', wrap(self.changelist_view), name='%s_%s_changelist' % info), В этом коде то, в принципе, и нет динамических url - они все типовые. А их динамичность (то есть зависимость от имени используемой модели в данном случае) находится на один уровень выше (/my_model/ и /my_model/add/). Здесь же регистрируются типовые действия для каждой модели: история действий, добавить, удалить и т. д. Динамичность здесь выражается только в уникальном name, который используется в основном для reverse и создается главным образом, как я понимаю, для ускорения работы этой функции (чтобы не было необходимости в поисках нужной функции проверять ее на каждый регэксп - ну то есть для чего и был придуман этот атрибут: указал имя url - и вперед). Если у вас приложение делает нечто подобное джанговской админке - да, такая динамичность имеет место быть. В ином случае логике не место в url-паттернах, как я и написал в комментарии к вопросу.
Комментариев нет:
Отправить комментарий