Django admin神奇的AdminSite 对象妙用

1,647 阅读3分钟

Django在Python web开发领域的地位可谓是无可替代,它大而全,任何你能想到的基本功能框架已经内置,可以很方便的达到开箱即用的效果,以Django自带的admin管理后台为例,借助admin可视化的管理面板,我们只需要通过少量的代码就可以拥有一个特别完整的站点,快速实现需求。

但在开发中,难免admin的布局不符合要求,我们想改,想添加数据无从下手,直接覆盖默认的admin似乎并不是最明智的选择,安装了很多第三方后台管理程序,用起来似乎还没有django admin好用,那我们今天就来看看如何通过AdminSite对象来自定义我们的管理站点!

管理后台看到的第一个页面是登录页面,那么我们就先来自定义我们的登录页!这里就忽略掉了创建项目及app的方法,相信这些基础的知识你已经掌握了!

这里我们创建了一个项目DjangoMall和一个dadminapp,这个dadminapp将代替django默认的admin,所有我们自定义admin的信息都放在这里, 项目解构如下!

项目解构

自定义AdminSite类

自定义自己的管理站点,只需要将 AdminSite 子类化,并覆盖或添加任何你喜欢的内容。然后,创建一个你的 AdminSite 子类的实例(与你实例化任何其他 Python 类的方式相同),并用它注册你的模型和 ModelAdmin 子类,而不是用默认站点。最后,更新 DjangoMall/urls.py 来引用你的 AdminSite 子类。

  1. dadmin/admin.py中构造自己的AdminSite 子类的实例:
# dadmin/admin.py

from django.contrib import admin

class DadminSite(admin.AdminSite):
    site_title = '管理站点<title>末尾的文字'
    site_header = '放在每个管理页面顶部的文字,默认为Django管理'
    index_title = '索引页顶部的文字,默认为“网站管理”'

admin_site = DadminSite(name='byadmin')
  1. DjangoMall/urls.py中引入你的DadminSite
# DjangoMall/urls.py

from django.urls import path
from dadmin.admin import admin_site

urlpatterns = [
    path('admin/', admin.site.urls),    # 默认后台管理的url
    path('byadmin/', admin_site.urls),  # 我们自己的管理站点url
]

当我们在浏览器访问127.0.0.1:8000/byadmin/后会发现我们拥有了一个和默认admin一样的管理站点,下来只需要自定义我们管理站点的模板即可!

下边是我已经设置好的一段代码,先上代码,再来解读代码!

# dadmin/admin.py

from django.contrib import admin
from django.utils.translation import gettext as _, gettext_lazy
from django.views.decorators.cache import never_cache

# Register your models here.
from .forms import DadminAuthenticationForm

class DadminSite(admin.AdminSite):
    # Text to put at the end of each page's <title>.
    site_title = gettext_lazy('DjangoMall site admin')

    # Text to put in each page's <h1>.
    site_header = gettext_lazy('DjanaoMall 管理')

    # Text to put at the top of the admin index page.
    index_title = gettext_lazy('Site administration')
    
    login_form = DadminAuthenticationForm
    login_template = "dadmin/login.html"
    index_template = 'dadmin/index.html'

    def get_urls(self):
        urls = super().get_urls()
        from dadmin.urls import admin_urls
        admin_urls = admin_urls
        return admin_urls + urls

    @never_cache
    def index(self, request, extra_context=None):
        """
        继承admin index向index添加数据
        """
        extra_context = {'ceshi': 'ceshi'}
        index_template = super().index(request, extra_context=extra_context)
        return index_template

admin_site = DadminSite(name='byadmin')

AdminSite属性

以上代码中的login_formlogin_templateindex_template为它的属性,用来覆盖或扩展基本的管理模板!除了以上几个还有很多,具体大家可以看看源码就明白了或查看官方文档!

这是官方文档:docs.djangoproject.com/zh-hans/3.2…

代码中的get_urls方法我们继承了AdminSite的get_urls方法向管理站点添加了一个新的视图! index方法继承了AdminSite的index方法,在extra_context中放入了我们想添加的数据,并返回给页面,这样我们就可以在首页添加任何我们想显示的数据,例如数据图标统计功能等!

微信截图_20210809130406.png

这就是我们自定义的管理站点首页界面!

详细代码请大家参考仓库:gitee.com/xingfugz/dj…