Is there any way to get a list of all views in an django app? I have googled for answer. All answers shows a way to get list of urls.
The ListView approach seems more semantic, because what I want is a list of posts, but it's also slightly more complex. It requires that I overwrite two methods. The DetailView approach only requires me to overwrite one method.
It will also explore the two major types of views: class-based and function-based views.
Django views are Python functions that takes http requests and returns http response, like HTML documents. A web page that uses Django is full of views with different tasks and missions. Views are usually put in a file called views.py located on your app's folder.
To get all the views present in a Django project, we create a function get_all_view_names()
which takes urlpatterns
as input and returns the complete list of views being used in the project as the output.
First, we import the root_urlconf
module using settings.ROOT_URLCONF
. Then root_urlconf.urls.urlpatterns
will give us the list of project's urlpatterns.
The above urlpatterns list contains RegexURLPattern
and RegexURLResolver
objects. Accessing .urlpatterns
on a RegexURLResolver
will further give us a list of RegexURLPattern
and RegexURLResolver
objects.
A RegexURLPattern
object will give us the view name which we are interested in. The callback
attribute on it contains the callable view. When we pass either a string in our urls like 'foo_app.views.view_name'
representing the path to a module and a view function name, or a callable view, then callback
attribute is set to this. Further accessing .func_name
will give us the view name.
We call the function get_all_view_names()
recursively and add the view names obtained from a RegexURLPattern
object to a global list VIEW_NAMES
.
from django.conf import settings
from django.core.urlresolvers import RegexURLResolver, RegexURLPattern
root_urlconf = __import__(settings.ROOT_URLCONF) # import root_urlconf module
all_urlpatterns = root_urlconf.urls.urlpatterns # project's urlpatterns
VIEW_NAMES = [] # maintain a global list
def get_all_view_names(urlpatterns):
global VIEW_NAMES
for pattern in urlpatterns:
if isinstance(pattern, RegexURLResolver):
get_all_view_names(pattern.url_patterns) # call this function recursively
elif isinstance(pattern, RegexURLPattern):
view_name = pattern.callback.func_name # get the view name
VIEW_NAMES.append(view_name) # add the view to the global list
return VIEW_NAMES
get_all_view_names(all_urlpatterns)
To get the list of all the views present in a Django application, we will use the get_all_view_names()
function defined above.
We will first import all the urlpatterns
of the application and pass this list to the get_all_view_names()
function.
from my_app.urls import urlpatterns as my_app_urlpatterns # import urlpatterns of the app
my_app_views = get_all_view_names(my_app_urlpatterns) # call the function with app's urlpatterns as the argument
my_app_views
gives us the list of all the views present in my_app
Django app.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With