как получить список всех представлений в приложении 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.