内容大纲
- Admin后台管理
- Xadmin后台管理
Admin
django内置了一个强大的组件叫Admin,提供给网站管理员快速开发运营后台的管理站点。
站点文档: https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/admin/
辅助文档:https://www.runoob.com/django/django-admin-manage-tool.html
注意:要使用Admin,必须先创建超级管理员. python manage.py createsuperuser
访问地址:http://127.0.0.1:8000/admin,
admin站点默认并没有提供其他的操作给我们,所以一切功能都需要我们进行配置,在项目中,我们每次创建子应用的时候都会存在一个admin.py文件,这个文件就是用于配置admin站点功能的文件。
admin.py里面允许我们编写的代码一共可以分成2部分:
列表页配置
主要用于针对项目中各个子应用里面的models.py里面的模型,根据这些模型自动生成后台运营站点的管理功能。
详情页完整配置
from django.contrib import admin # 导入admin父类 模型管理器
from .models import Student # 导入模型类(给那个模型加后台管理)
class StudentModelAdmin(admin.ModelAdmin):
"""学生模型管理器"""
# date_hierarchy = 'born' # 按指定时间字段的不同值来进行选项排列,字段值必须为时间格式
# 要显示在admin页面的字段
list_display = ['id', 'name', 'sex', 'classmeta', 'class2', 'description']
'''classmeta的显示效果不如class2的显示效果'''
ordering = ['-id'] # 设置默认排序字段,字段前面加上-号表示倒叙排列
list_filter = ["class_num"] # 过滤器
search_fields = ["name"] # 搜索内容,会有一个搜索框 搜指定的字段,name
# 自定义模型管理器,不是模型的字段
def class2(self, obj):
return obj.class_num + '班'
class2.short_description = '班级' # 自定义字段描述信息
class2.admin_order_field = 'class_num' # 可以设置一个自定义字段为用户提供点击就按照字段来排序的功能
# actions_on_bottom = False # 下方控制栏是否显示,默认False表示隐藏
# actions_on_top = False # 上方控制栏是否显示,默认True表示隐藏
readonly_fields = ['name'] # 只读,不能修改,admin显示也会不能选中
# 字段集,fieldsets和fields只能使用其中之一
fieldsets = (
("基本资料", {
'fields': ('name', 'age', 'sex')
}),
('详细资料', {
'classes': ('collapse',), # 折叠样式,在其他的选项里面也可以填写
'fields': ('class_num', ),
}),
('详细资料', {
'classes': ('collapse',), # 折叠样式,在其他的选项里面也可以填写
'fields': ('description', ),
}),
)
'''元祖里面第一个是自定义菜单名称,不限数量的写'''
def delete_model(self, request, obj):
'''
删除数据的钩子:删除数据的时候触发
中间可以进行权限,或者日志等其他相关操作
eg:在后台删除一些会员用户,多条数据联动,需要写日志
'''
# 除了root用户,其他用户删除数据的时候,都会报错
if request.user.username != "root":
raise Exception('你没有权限删除这个数据')
return super().delete_model(request, obj)
def save_model(self, request, obj, form, change):
'''
保存数据的钩子[会在添加/修改模型数据的时候出发]
:param request:
:param obj: 本次操作的模型,有id就表示修改
:param form: 表单,用户提交过来的数据
:param change: 修改后的数据
:return:
'''
if obj.id:
print('有人修改了数据') # 修改数据会打印
else:
print('有人添加了数据') # 添加数据会打印
# 最后输出出去
# admin.site.register(模型类, 模型管理类)
admin.site.register(Student, StudentModelAdmin)
折叠效果演示
![0932fe1d0f46053f16d20c134815c980.gif](https://i-blog.csdnimg.cn/blog_migrate/f6ddd705d40a727425ee7e597eecd501.gif)
Xadmin
xadmin是Django的第三方扩展,是一个比Django的admin站点使用更方便的后台站点。构建于admin站点之上。
文档:http://sshwsfc.github.io/xadmin/
https://xadmin.readthedocs.io/en/latest/index.html
1.1. 安装
通过如下命令安装xadmin的最新版
pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2
在配置文件settings.py中注册如下应用
# (主包, 表单包, 操作记录系统)
INSTALLED_APPS = [
...
'xadmin', # 主包
'crispy_forms', # 表单包
'reversion', # 操作记录系统
...
]
# 修改使用中文界面
LANGUAGE_CODE = 'zh-Hans'
# 修改时区
TIME_ZONE = 'Asia/Shanghai'
xadmin有建立自己的数据库模型类,需要进行数据库迁移
python manage.py makemigrations
python manage.py migrate
在总路由urls.py中添加xadmin的路由信息
import xadmin
xadmin.autodiscover()
# version模块自动注册需要版本控制的 Model
from xadmin.plugins import xversion
xversion.register_models()
urlpatterns = [
path('xadmin/', xadmin.site.urls),
]
完整urls.py
from django.contrib import admin
from django.urls import path, include
# xadmin的路由注册
import xadmin
xadmin.autodiscover()
# version模块自动注册需要版本控制的 Model
from xadmin.plugins import xversion # 自动注册
xversion.register_models() # 版本控制
urlpatterns = [
path('admin/', admin.site.urls),
path('xadmin/', xadmin.site.urls),
path('students/', include("students.urls")),
]
创建超级用户
python manage.py createsuperuser
写password的时候,是没有显示的
1.2. 使用
- xadmin不再使用Django的admin.py进行功能配置了,而是需要编写代码在子应用的adminx.py文件中。
- xadmin的站点管理类不用继承
admin.ModelAdmin
,而是直接继承object
即可。
例如:在子应用students中创建adminx.py文件。
1.2.1 站点的全局配置
import xadmin
from xadmin import views
class BaseSetting(object):
"""xadmin的基本配置"""
enable_themes = True # 开启主题切换功能
use_bootswatch = True
xadmin.site.register(views.BaseAdminView, BaseSetting)
class GlobalSettings(object):
"""xadmin的全局配置"""
site_title = "绝活小队" # 设置站点标题
site_footer = "绝活小队有限公司" # 设置站点的页脚
menu_style = "accordion" # 设置菜单折叠
xadmin..register(views.CommAdminView, GlobalSettings)
1.2.2 站点Model管理
xadmin可以使用的页面样式控制基本与Django原生的admin一致。
- list_display 控制列表展示的字段
list_display = ['id', 'title', 'read', 'comment']
- search_fields 控制可以通过搜索框搜索的字段名称,xadmin使用的是模糊查询
search_fields = ['id','title']
- list_filter 可以进行过滤操作的列,对于分类、性别、状态
list_filter = ['is_delete']
- ordering 默认排序的字段
- readonly_fields 在编辑页面的只读字段
- exclude 在编辑页面隐藏的字段
- list_editable 在列表页可以快速直接编辑的字段
- show_detail_fields 在列表页提供快速显示详情信息
- refresh_times 指定列表页的定时刷新
refresh_times = [5, 10,30,60] # 设置允许后端管理人员按多长时间(秒)刷新页面
- list_export 控制列表页导出数据的可选格式
list_export = ('xls', 'xml', 'json') list_export设置为None来禁用数据导出功能
list_export_fields = ('id', 'title', 'pub_date') # 允许导出的字段
![c5ae271633eeb01fd97925fcd50f753c.png](https://i-blog.csdnimg.cn/blog_migrate/b1032b94d9ca40ab4b3bf4493178764b.jpeg)
- show_bookmarks 控制是否显示书签功能
show_bookmarks = True
- data_charts 控制显示图表的样式
data_charts = {
# "order_amount": { # 左面这个是别名
# 'title': '图表的标题',
# "x-field": "x轴的字段值",
# "y-field": ('y轴的字段值1', 'y轴字段值2'),
# "order": ('要排序的字段',)
# },
# 支持生成多个不同的图表
"order_amount": {
'title': '班级人数',
"x-field": "class_num",
"y-field": ('id',),
"order": ('class_num',)
},
}
- title 控制图标名称
- x-field 控制x轴字段
- y-field 控制y轴字段,可以是多个值
- order 控制默认排序
- model_icon 控制菜单的图标
这里使用的图标是来自bootstrap3的图标。https://v3.bootcss.com/components/
就是子应用模型表的名字前面的图标
class BookInfoAdmin(object):
model_icon = 'fa fa-gift'
xadmin.site.register(models.BookInfo, BookInfodmin)
修改admin或者xadmin站点下的子应用成中文内容。
需要去两个文件里面去配置
在子应用的apps.py下面的配置中,新增一个属性verbose_name
from django.apps import AppConfig
class StudentsConfig(AppConfig):
name = 'students'
verbose_name = "学生管理"
然后在当前子应用的init.py里面新增一下代码:
default_app_config = "students.apps.StudentsConfig"
1.2.3完整adminx.py
import xadmin # 拿xadmin
from .models import Student # 拿模型
from xadmin import views
class BaseSetting(object):
"""xadmin的基本配置"""
enable_themes = True # 开启主题切换功能
use_bootswatch = True
xadmin.site.register(views.BaseAdminView, BaseSetting)
class GlobalSettings(object):
"""xadmin的全局配置"""
site_title = "绝活小队" # 设置站点标题
site_footer = "绝活小队有限公司" # 设置站点的页脚
menu_style = "accordion" # 设置菜单折叠
xadmin.site.register(views.CommAdminView, GlobalSettings)
class StudentModelAdmin(object):
list_display = ['id', 'name', 'age', 'sex', 'class2', 'description']
"""xadmin的基本配置"""
enable_themes = True # 开启主题切换功能
use_bootswatch = True
def class2(self, obj):
return obj.class_num + '班'
# 下面两条一般一起使用,如果不加第二行,就不可以自动排序
class2.short_description = '班级' # 自定义字段描述信息(显示在admin页面的字段名)
class2.admin_order_field = 'class_num' # 可以设置一个自定义字段为用户提供点击就按照字段来排序的功能
search_fields = ['id', 'name'] # 搜索框
list_filter = ['class_num', 'name'] # 过滤器
readonly_fields = ['name'] # 只读,不可修改不可选中
list_editable = ['description'] # 在主页面就可以直接修改,就像是审核后台页面
# 给那个字段设置,那个字段后面就出现感叹号!
# 点一下就会出现所有的信息,放在id或者名字都可以
show_detail_fields = ['description', 'name'] # 显示详情
refresh_times = [5, 10, 30, 60] # 设置允许后端管理人员按多长时间(秒)刷新页面,可点击选择不刷新
# 从数据库中导出数据,导入到本地
list_export = ('xls', 'xml', 'json') # list_export设置为None来禁用数据导出功能
list_export_fields = ('id', 'title', 'pub_date') # 允许导出的字段
data_charts = {
# "order_amount": { # 左面这个是别名
# 'title': '图表的标题',
# "x-field": "x轴的字段值",
# "y-field": ('y轴的字段值1', 'y轴字段值2'),
# "order": ('要排序的字段',)
# },
# 支持生成多个不同的图表
"order_amount": {
'title': '班级人数',
"x-field": "class_num",
"y-field": ('id',),
"order": ('class_num',)
},
}
# xadmin.site.register(模型, 模型管理类)
xadmin.site.register(Student, StudentModelAdmin)