как получить список всех представлений в приложении django?

есть ли способ получить список всех представлений в приложении django? Я погуглил для ответа. Все ответы показывают способ получить список URL-адресов.

2 ответов


получение списка всех представлений проекта Django:

чтобы получить все представления, присутствующие в проекте Django, мы создаем функцию get_all_view_names() что происходит urlpatterns в качестве входных данных и возвращает полный список представлений, используемых в проекте в качестве выходных данных.

во-первых, мы импортируем root_urlconf модуль с помощью settings.ROOT_URLCONF. Тогда root_urlconf.urls.urlpatterns даст нам список urlpatterns проекта.

приведенный выше список urlpatterns содержит RegexURLPattern и RegexURLResolver объекты. Доступ .urlpatterns на RegexURLResolver далее даст нам список RegexURLPattern и RegexURLResolver объекты.

A


добавление выше исправить Рахул, если кто-то использует Питон3, вам нужно будет использовать __name__ вместо func_name:

...
            view_name = pattern.callback.__name__
...

в противном случае вы получите следующее:

AttributeError: 'function' object has no attribute 'get_all_view_names'

(спасибо scipy-gitbot at https://github.com/scipy/scipy/issues/2101#issuecomment-17027406

в качестве альтернативы, если вы не склонны использовать глобальные переменные, вот что я в конечном итоге использование:

all_urlpatterns = __import__(settings.ROOT_URLCONF).urls.urlpatterns
detail_views_list = []

def get_all_view_names(urlpatterns):
    for pattern in urlpatterns:
        if isinstance(pattern, RegexURLResolver):
            get_all_view_names(pattern.url_patterns)
        elif isinstance(pattern, RegexURLPattern):
            detail_views_list.append(pattern.callback.__name__)
get_all_view_names(all_urlpatterns)
all_views_list = []

# remove redundant entries and specific ones we don't care about
for each in detail_views_list:
    if each not in "serve add_view change_view changelist_view history_view delete_view RedirectView":
        if each not in all_views_list:
            all_views_list.append(each)

тогда вы можете просто повторить через all_views_list чтобы получить список отфильтрованных.

обновление: 1 марта 2018

В Django 2.0, django.core.urlresolvers переехал в django.urls. RegexURLPattern и RegexURLResolver переименованы в URLPattern и URLResolver. Поэтому вы должны использовать

from django.urls import URLResolver, URLPattern

вместо

from django.core.urlresolvers import RegexURLResolver, RegexURLPattern

если вы используете Django 2.