django后台管理+美化

发布于:2024-05-10 ⋅ 阅读:(24) ⋅ 点赞:(0)

django后台管理+美化

【1】后台管理

(0)创建管理员

  • 使用terminal创建管理员
    • python manage.py createsuperuser
    • 不显示输入的密码
  • 使用pycharm的工具run manage.py task
    • createsuperuser
    • 显示输入的密码

image-20240420163213880

(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 参数添加额外的权限。
# 模型表
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',
    ]
  • 默认站点和自定义站点的对比

image-20240420171144082

(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 = '浏览器标题'

image-20240420201311028

【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',
]

image-20240420201123506

image-20240420200743728

(3)自定义操作

(3.1)自定义主题
  • 指定simpleui默认的主题,指定一个文件名,相对路径就从simpleui的theme目录读取

  • # 配置文件settings
    SIMPLEUI_DEFAULT_THEME = 'simpleui.css'admin.site.site_header = '123'
    
  • image-20240420173548869

(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:是否浏览器新标签中打开
  • image-20240420201427742

  • 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;'
    
  • image-20240420201622237


网站公告

今日签到

点亮在社区的每一天
去签到