Django在Python web开发领域的地位可谓是无可替代,它大而全,任何你能想到的基本功能框架已经内置,可以很方便的达到开箱即用的效果,以Django自带的admin管理后台为例,借助admin可视化的管理面板,我们只需要通过少量的代码就可以拥有一个特别完整的站点,快速实现需求。
但在开发中,难免admin的布局不符合要求,我们想改,想添加数据无从下手,直接覆盖默认的admin似乎并不是最明智的选择,安装了很多第三方后台管理程序,用起来似乎还没有django admin好用,那我们今天就来看看如何通过AdminSite对象来自定义我们的管理站点!
管理后台看到的第一个页面是登录页面,那么我们就先来自定义我们的登录页!这里就忽略掉了创建项目及app的方法,相信这些基础的知识你已经掌握了!
这里我们创建了一个项目DjangoMall和一个dadmin的app,这个dadmin的app将代替django默认的admin,所有我们自定义admin的信息都放在这里, 项目解构如下!
自定义AdminSite类
自定义自己的管理站点,只需要将 AdminSite 子类化,并覆盖或添加任何你喜欢的内容。然后,创建一个你的 AdminSite 子类的实例(与你实例化任何其他 Python 类的方式相同),并用它注册你的模型和 ModelAdmin 子类,而不是用默认站点。最后,更新 DjangoMall/urls.py 来引用你的 AdminSite 子类。
- 在
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')
- 在
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_form、login_template、index_template为它的属性,用来覆盖或扩展基本的管理模板!除了以上几个还有很多,具体大家可以看看源码就明白了或查看官方文档!
这是官方文档:docs.djangoproject.com/zh-hans/3.2…
代码中的get_urls方法我们继承了AdminSite的get_urls方法向管理站点添加了一个新的视图! index方法继承了AdminSite的index方法,在extra_context中放入了我们想添加的数据,并返回给页面,这样我们就可以在首页添加任何我们想显示的数据,例如数据图标统计功能等!
这就是我们自定义的管理站点首页界面!
详细代码请大家参考仓库:gitee.com/xingfugz/dj…