Страницы

Поиск по вопросам

четверг, 22 ноября 2018 г.

Django. Кто как создает urlpatterns?

Меня интересует кто как создает 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-паттернах, как я и написал в комментарии к вопросу.

Комментариев нет:

Отправить комментарий