Страницы

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

понедельник, 23 декабря 2019 г.

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

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

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

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