django后台管理+美化

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_passwordis_authenticatedset_passwordsave
  • 如果想要在此基础上添加额外字段可以继承模型表,扩写自己自己的字段(已有的字段不要再写)

    • 首先继承模型表
      • 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_namelast_name 字段的组合必须是唯一的。
      • indexes:定义数据库索引。Django 2.2及更高版本支持此选项。通过它可以为模型字段创建数据库索引,提高查询性能。
      • permissions :额外的权限定义。默认情况下,Django会为每个模型自动生成三个权限:添加、修改和删除。但你可以通过 permissions 参数添加额外的权限。
python 复制代码
# 模型表
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 会自动为这个模型生成一个基本的后台管理界面,包含模型的所有字段。
    • 优点:简单易用,只需一行代码就可以为模型添加后台管理界面。
    • 缺点:无法进行自定义,比如改变字段的显示顺序、添加自定义方法或链接等。
  • 方式二:自定义注册

    python 复制代码
    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):自定义显示规则字段,最后还是需要添加到显示列表中
  • 自定义注册示例

python 复制代码
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字段
python 复制代码
from django.apps import AppConfig

class ApiConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "app名字"
    verbose_name = '自定义后台名字'

(4)修改左上角标题

  • 在任意admin文件中
python 复制代码
from django.contrib import admin
admin.site.site_header = '后台标题'
python 复制代码
admin.site.site_title = '浏览器标题'

【2】django-simpleui美化

(1)安装

python 复制代码
pip install django-simpleui

(2)注册到app中

  • 最好放在所有app的最上方,起码要在admin的上方
python 复制代码
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目录读取

python 复制代码
# 配置文件settings
SIMPLEUI_DEFAULT_THEME = 'simpleui.css'admin.site.site_header = '123'
(3.2)关闭广告
python 复制代码
# 配置文件settings
SIMPLEUI_HOME_INFO = False
SIMPLEUI_ANALYSIS = False
python 复制代码
# 配置文件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:是否浏览器新标签中打开
python 复制代码
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)返回给前端信息
python 复制代码
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;'
相关推荐
独行soc32 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
蓝天星空36 分钟前
Python调用open ai接口
人工智能·python
jasmine s1 小时前
Pandas
开发语言·python
郭wes代码1 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
White_Mountain1 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship1 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站1 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
leaf_leaves_leaf1 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零11 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志