1

What is the simplest way to add a view to my Django (3.2) admin UI? That is, add a URL mysite.com/admin/my-view so that visiting that URL acts like the rest of admin (in particular, requires similar permissions).

There is a whole page on this, but it's not obvious to me how to piece it together.

https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#adding-views-to-admin-sites says you can add a get_urls to your AdminSite class. Okay, so I need my own AdminSite class. And I need to register it in apps, maybe?

I did this:

class MyAdminSite(admin.AdminSite):
    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('my-view', self.my_view, name='my-view')
        ]
        return my_urls + urls

    def my_view(self, request):
        # do something ..

admin_site = MyAdminSite(name='my_admin')

and this in urls.py:

from .admin import admin_site


urlpatterns = [
    path('admin/', admin_site.urls),

and this in unchanged in INSTALLED_APPS in settings:

    'django.contrib.admin',

But, now it only shows the admin for the one app, instead of for all the apps. So how do I get it to auto-discover all the apps like it used to? Or is there a simpler way?

P.S. There is also a question on this, but the answer didn't have enough detail for me to use it.

EDIT: I'm reading Make new custom view at django admin and Django (1.10) override AdminSite ..

EDIT 2: This was a hack, but it works for me:

from django.contrib.admin import site

admin_site._registry.update(site._registry)

I had to update in the right place (the project urls.py), perhaps when all the other admin stuff is already loaded.

dfrankow
  • 20,191
  • 41
  • 152
  • 214

0 Answers0