Django admin神奇的AdminSite 对象妙用

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

但在开发中,不免admin的布局不符合要求,咱们想改,想添加数据无从下手,直接覆盖默认的admin彷佛并非最明智的选择,安装了不少第三方后台管理程序,用起来彷佛尚未django admin好用,那咱们今天就来看看如何经过AdminSite对象来自定义咱们的管理站点!python

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

这里咱们建立了一个项目DjangoMall和一个dadminapp,这个dadminapp将代替django默认的admin,全部咱们自定义admin的信息都放在这里, 项目解构以下!web

项目解构

自定义AdminSite类

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

  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同样的管理站点,下来只须要自定义咱们管理站点的模板便可!api

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

# 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…markdown

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

微信截图_20210809130406.png

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

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

相关文章
相关标签/搜索