django后台管理+美化
【1】后台管理
(0)创建管理员
- 使用terminal创建管理员
python manage.py createsuperuser
- 不显示输入的密码
- 使用pycharm的工具
run manage.py task
createsuperuser
- 显示输入的密码
(1)扩写django用户表
-
auth_user表原有字段
-
id:用户的唯一标识符。
-
username:用户名,用于登录。
-
password:用户密码,通常存储为哈希值。
-
first_name、last_name:用户的名、姓。
-
email:用户的电子邮件地址。
-
is_active:标志用户是否活跃,即是否可登录。
-
is_staff:标志用户是否可以登录后台管理界面。
-
is_superuser:标志用户是否拥有所有权限。
-
date_joined:用户加入系统的时间。
-
原有方法
__str__
、check_password
、is_authenticated
、set_password
、save
等
-
-
如果想要在此基础上添加额外字段可以继承模型表,扩写自己自己的字段(已有的字段不要再写)
- 首先继承模型表
from django.contrib.auth.models import AbstractUser
- 然后去配置文件中修改模型表
- AUTH_USER_MODEL = ‘用户app.模型表’
Meta
类中设置的常见参数:- db_table:指定该模型在数据库中使用的表名。默认情况下,Django会根据应用名称和模型名称来生成表名。
- ordering:指定默认的排序方式。例如,
ordering = ['-name']
意味着在查询时,结果将按照name
字段降序排列。 - verbose_name_plural:定义模型的人类可读的名称。Django管理界面会使用这个值。
- abstract:如果设置为
True
,这个模型将作为一个抽象基类,不会被用于数据库表创建。它只能被其他模型继承。 - default_permissions:定义创建模型时自动生成的权限。默认是
('add', 'change', 'delete')
。如果你不想自动生成这些权限,可以设置为()
。 - unique_together:定义一个或多个字段的组合,这些字段的组合在数据库表中必须是唯一的。例如,
unique_together = (("first_name", "last_name"),)
表示first_name
和last_name
字段的组合必须是唯一的。 - indexes:定义数据库索引。Django 2.2及更高版本支持此选项。通过它可以为模型字段创建数据库索引,提高查询性能。
- permissions:额外的权限定义。默认情况下,Django会为每个模型自动生成三个权限:添加、修改和删除。但你可以通过
permissions
参数添加额外的权限。
- 首先继承模型表
# 模型表
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
mobile = models.CharField(max_length=11, verbose_name='手机号码')
class Meta:
db_table = 'user_info'
verbose_name_plural = '用户信息表'
# 配置文件
AUTH_USER_MODEL = 'app名字.UserInfo'
(2)admin站点
-
方式一:简单注册
admin.site.register(表名)
- 这种方式是最简单的注册模型到 admin 的方法。只需要调用
admin.site.register()
函数,并传入你想要管理的模型类即可。Django 会自动为这个模型生成一个基本的后台管理界面,包含模型的所有字段。 - 优点:简单易用,只需一行代码就可以为模型添加后台管理界面。
- 缺点:无法进行自定义,比如改变字段的显示顺序、添加自定义方法或链接等。
-
方式二:自定义注册
-
from django.contrib import admin from user.models import 模型表 from django.utils.html import format_html @admin.register(模型表) class 模型表Admin(admin.ModelAdmin): # ... 其他自定义代码 ...
-
这种方式允许你更深入地自定义模型在 admin 站点中的表现。通过继承
admin.ModelAdmin
类并重写其中的方法,你可以控制模型的显示方式、添加自定义操作等。 -
常用参数
ordering = []
:排序规则列表,默认是升序太提添加负号就是降序list_display=[]
:显示字段列表,列表中的字段会在后台管理中显示display_字段(self,obj)
:自定义显示规则字段,最后还是需要添加到显示列表中
-
-
自定义注册示例
from django.contrib import admin
from user.models import UserInfo
from django.utils.html import format_html
# Register your models here.
@admin.register(UserInfo)
class UserInfoAdmin(admin.ModelAdmin):
# 按照id排序,可以指定正序还是逆序
# 是个列表说明可以多个值
ordering = ['id']
# 自定义显示字段
def display_avatar(self, obj):
# 获取avatar路径
avatar_path = obj.avatar if obj.avatar else 'static/avatar/default_male.png'
# 拼接完整路径
avatar_url = f"http://127.0.0.1:8080/media/{avatar_path}"
# 返回html格式
return format_html(
f'<a href="{avatar_url}" target="_blank">'
f'<img src="{avatar_url}" alt="请稍后再试哦" style="width: 50px;height: auto">'
f'</a>'
)
# 给方法起别名,在添加到list_display中
display_avatar.short_description = '用户头像'
# 显示部分信息
def display_password(self, obj):
return obj.password[-5:]
# 给方法起别名,在添加到list_display中
display_password.short_description = '简单的加密密码'
# 自定义后台展示的信息
# 多对多字段无法添加
list_display = [
'id', 'username', 'display_password', 'email',
'cellphone', 'display_avatar', 'gender', 'create_time',
'update_time', 'is_deleted',
]
- 默认站点和自定义站点的对比
(3)后台app名称修改
- 在app文件中添加verbose_name字段
from django.apps import AppConfig
class ApiConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "app名字"
verbose_name = '自定义后台名字'
(4)修改左上角标题
- 在任意admin文件中
from django.contrib import admin
admin.site.site_header = '后台标题'
admin.site.site_title = '浏览器标题'
【2】django-simpleui美化
(1)安装
pip install django-simpleui
(2)注册到app中
- 最好放在所有app的最上方,起码要在admin的上方
INSTALLED_APPS = [
# 最上方
'simpleui',
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
'rest_framework',
'rest_framework_simplejwt',
]
(3)自定义操作
(3.1)自定义主题
-
指定simpleui默认的主题,指定一个文件名,相对路径就从simpleui的theme目录读取
-
# 配置文件settings SIMPLEUI_DEFAULT_THEME = 'simpleui.css'admin.site.site_header = '123'
-
(3.2)关闭广告
-
# 配置文件settings SIMPLEUI_HOME_INFO = False SIMPLEUI_ANALYSIS = False
(3.3)自定义logo
-
# 配置文件settings # 本地静态文件或链接都可以 SIMPLEUI_LOGO = '/static/default.png'
(3.4)自定义菜单栏
-
system_keep
保留系统菜单:该字段用于告诉simpleui,是否需要保留系统默认的菜单- 默认为False,不保留。
- 如果改为True,自定义和系统菜单将会并存
-
menu_display
过滤显示菜单和排序功能:该字段用于告诉simpleui,是否需要开启过滤显示菜单和排序功能。- 默认可以不用填写,缺省配置为默认排序,不对菜单进行过滤和排序。
- 开启认为传一个列表,如果列表为空,则什么也不显示。列表中的每个元素要对应到menus里面的name字段
-
dynamic
开启动态菜单功能:该字段用于告诉simpleui,是否需要开启动态菜单功能。- 默认可以不用填写,缺省配置为False,不开启动态菜单功能。
- 开启为True,开启后,每次用户登陆都会刷新左侧菜单配置。
- 需要注意的是:开启后每次访问admin都会重读配置文件,所以会带来额外的消耗。
-
menus说明
- name:菜单名
- icon:图标
- url:链接地址,绝对或者相对,如果存在models字段,将忽略url
- models:子菜单,最多3级菜单
- newTab:是否浏览器新标签中打开
-
-
SIMPLEUI_CONFIG = { 'system_keep': True, 'dynamic': True, 'menus': [ { 'name': '搜索引擎', 'icon': 'fa fa-th-list', 'models': [ { 'name': '百度', 'url': 'https://www.baidu.com/', 'icon': 'fa fa-tasks', 'newTab': True, }, { 'name': '搜狗', 'url': 'https://www.sogou.com/', 'icon': 'fa fa-tasks', 'newTab': True, }, ] }, ] }
(3.5)自定义按钮
-
在admin的表中进行添加
-
actions
:方法列表,后续需要重写这个列表中的方法 -
def 方法(self, request, queryset):
- request发送的是POST请求,可以从POST中拿取数据,如果是勾选多个值这种,需要getlist获取
queryset
:就是当前数据的所有qs
对象- 可以执行
self.message_user(request, f"所选书籍的总价格为:{sum_price}元", messages.SUCCESS)
返回给前端信息
-
from django.contrib import admin from .models import Book from django.contrib import messages @admin.register(Book) class BookAdmin(admin.ModelAdmin): ordering = ['id'] list_display = ['id', 'name', 'price', 'publish'] # 增加自定义按钮 actions = ['price_sum', ] def price_sum(self, request, queryset): choice_list = request.POST.getlist('_selected_action') sum_price = sum(float(queryset.filter(pk=pk).first().price) for pk in choice_list) print(sum_price) self.message_user(request, f"所选书籍的总价格为:{sum_price}元", messages.SUCCESS) price_sum.short_description = '总价格' price_sum.type = 'success' price_sum.style = 'color:black;'
-