• 13.django-admin组件


    Django内置了一个强大的组件叫Admin,提供给网站管理员快速开发运营后台的管理站点,下面通过案例进行操作

    1.创建模型类

    模型类如下:

    复制代码
    from django.db import models
    
    
    # Create your models here.
    
    
    class Classes(models.Model):
        """ 班级表 """
        title = models.CharField(max_length=32, verbose_name='班级名称')
    
        def __str__(self):
            return self.title
    
    
    class Students(models.Model):
        """ 学生表 """
        username = models.CharField(max_length=128, default=None, null=True, verbose_name='学生姓名')
        mobile = models.CharField(max_length=32, null=True, unique=True, verbose_name='手机号', help_text='手机号')
        wxchat = models.CharField(max_length=100, null=True, unique=True, verbose_name='微信', help_text='微信')
        qq_number = models.CharField(max_length=16, null=True, unique=True, verbose_name='QQ', help_text='QQ')
        nickname = models.CharField(max_length=128, default=None, null=True, verbose_name='昵称')
        age = models.SmallIntegerField(verbose_name='年龄')
        email = models.CharField(max_length=128, default=None, null=True, verbose_name='邮箱')
        en_date = models.DateField(verbose_name='入学日期')
        addr = models.CharField(max_length=32, default=None, null=True, verbose_name='地址')
        to_classes = models.ForeignKey('Classes', default=1, verbose_name='所属班级', on_delete=models.CASCADE)
    
        def __str__(self):
            return self.username
    复制代码

    生成数据库表

     python manage.py makemigrations
    python manage.py migrate

     

    2. 使用脚本生成测试数据

    在项目根目录下创建test.py脚本如下:

    复制代码
    import os
    import django
    import random
    import faker  # pip install faker
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "adminStudy.settings")  # MB:项目名称
    django.setup()
    
    from student import models
    
    fk = faker.Faker(locale='zh_CN')
    
    
    def create():
        models.Classes.objects.bulk_create((models.Classes(i, random.randrange(100, 500)) for i in range(10)))
        gen = (
            models.Students(
                i,
                fk.name(),
                fk.phone_number(),
                fk.phone_number(),
                fk.phone_number(),
                fk.user_name(),
                random.randrange(15, 20),
                fk.email(),
                fk.date(),
                fk.city_name(),
                random.randrange(0, 9)
            ) for i in range(1, 1001)
        )
        models.Students.objects.bulk_create(gen)
    
    
    if __name__ == '__main__':
        create()
    复制代码

     

    3. 创建超级管理员

    命令

    python manage.py createsuperuser   # 创建管理员命令

     

     

     

    4. 使用管理员登录

    django项目默认帮助我们生成管理员登录路由了

    urlpatterns = [
        path('admin/', admin.site.urls),
    ]

    我们在浏览器中输入地址

    http://127.0.0.1:8080/admin/login/

    登录页面如下

     

     

     使用用户名和密码登录,页面如下

     

     

     

    5.将我们的模型类纳入admin管理

    在子项目的admin中写入如下代码

    复制代码
    from django.contrib import admin
    from student import models
    
    
    class StudentModelAdmin(admin.ModelAdmin):  # 必须继承 admin.ModelAdmin
        pass
    
    @admin.register(models.Classes)  # 或者使用装饰器进行注册
    class ClassesModelAdmin(admin.ModelAdmin):
        pass
    复制代码

    再次访问页面如下

     

     

     

     

     

     

     6.中文显示

    我们希望将系统语言,项目名称和表名称都换成指定中文

    • 系统语言,设置settings.py
      # LANGUAGE_CODE = 'en-us'
      LANGUAGE_CODE = 'zh-hans'

       

    • 项目名称,设置子项目的apps.py文件
      复制代码
      from django.apps import AppConfig
      
      
      class StudentConfig(AppConfig):
          default_auto_field = 'django.db.models.BigAutoField'
          name = 'student'
          verbose_name = "学生信息管理"
      复制代码
    • 表名称,设置模型类如下
      复制代码
      from django.db import models
      
      
      # Create your models here.
      
      
      class Classes(models.Model):
          """ 班级表 """
          title = models.CharField(max_length=32, verbose_name='班级名称')
      
          def __str__(self):
              return self.title
      
          class Meta:
              verbose_name = '班级'
              verbose_name_plural = '班级'
      
      
      class Students(models.Model):
          """ 学生表 """
          username = models.CharField(max_length=128, default=None, null=True, verbose_name='学生姓名')
          mobile = models.CharField(max_length=32, null=True, unique=True, verbose_name='手机号', help_text='手机号')
          wxchat = models.CharField(max_length=100, null=True, unique=True, verbose_name='微信', help_text='微信')
          qq_number = models.CharField(max_length=16, null=True, unique=True, verbose_name='QQ', help_text='QQ')
          nickname = models.CharField(max_length=128, default=None, null=True, verbose_name='昵称')
          age = models.SmallIntegerField(verbose_name='年龄')
          email = models.CharField(max_length=128, default=None, null=True, verbose_name='邮箱')
          en_date = models.DateField(verbose_name='入学日期')
          addr = models.CharField(max_length=32, default=None, null=True, verbose_name='地址')
          to_classes = models.ForeignKey('Classes', default=1, verbose_name='所属班级', on_delete=models.CASCADE)
      
          def __str__(self):
              return self.username
      
          class Meta:
              verbose_name = '学生'
              verbose_name_plural = '学生'
      复制代码

       

    此时页面如下

     

     

     7.表显设置

    我们可以很大程度上自定义设置页面显示内容,官网:https://docs.djangoproject.com/en/2.1/ref/contrib/admin/

    一开始,学生表的显示如下,非常单调且不友好

     

     

     

    完善如下:

    添加班级时,可以通过设置inlines字段同时为该班级添加一些学生,因为学生表ForeignKey的班级表。

    actions即在列表页,可操作的一些功能,它默认实现了一个删除操作:

    复制代码
     1 from django.contrib import admin
     2 from student import models
     3 
     4 
     5 class StudentModelAdmin(admin.ModelAdmin):  # 必须继承 admin.ModelAdmin
     6     """ 用户模型管理类,用于在admin后台对Students模型类进行扩展 """
     7     list_per_page = 20  # 列表页每页展示数据的条数控制
     8     # 在列表页展示哪些字段
     9     list_display = ['id', 'username', 'age', 'email', 'mobile', 'nickname', 'to_classes']
    10     # 设置点击指定字段跳转到编辑页面
    11     list_display_links = ['id', 'username', 'age']
    12     # 默认是以id进行排序,你也可以通过ordering,设置指定字段排序
    13     # ordering = ['-age']  # ['age']: 升序; ['-age']: 降序
    14     ordering = ['-age', 'id']  # 年龄相同的,就按照id升序排序
    15     actions_on_top = True     # 上方操作栏是否显示,False表示隐藏
    16     # actions_on_bottom = True  # 下方操作栏是否显示,False表示隐藏
    17     list_filter = ['to_classes', 'age', 'en_date']  # 过滤器,按指定字段进行筛选过滤, 可以写多个过滤器,在右侧展示
    18     search_fields = ['username', 'nickname']  # 指定字段搜索
    19     # 注意,要编辑的字段必须在list_display中,但是也必须不在list_display_links中
    20     # list_editable = ['email', 'mobile']
    21     # date_hierarchy = "en_date"  # 按照入学时间不同,可以进行过滤,在上方展示,这个筛选必须是日期时间相关的字段
    22 
    23     def my_edit(self, request, queryset):
    24         """ 将选中的记录,年龄设置为10 """
    25         print(request.POST.getlist("_selected_action"))  # ['5', '12']
    26         pk_list = request.POST.getlist("_selected_action")
    27         models.Students.objects.filter(pk__in=pk_list).update(age=10)
    28 
    29     my_edit.short_description = "自定义编辑功能"
    30 
    31     def my_edit2(self, request, queryset):
    32         """ 将选中的记录,年龄设置为10 """
    33         print(request.POST.getlist("_selected_action"))  # ['5', '12']
    34         pk_list = request.POST.getlist("_selected_action")
    35         models.Students.objects.filter(pk__in=pk_list).update(age=10)
    36 
    37     my_edit.short_description = "自定义编辑功能2"
    38     actions = [my_edit,my_edit2]
    39 admin.site.register(models.Students, StudentModelAdmin)  # 必须进行注册
    40 
    41 
    42 @admin.register(models.Classes)  # 或者使用装饰器进行注册
    43 class ClassesModelAdmin(admin.ModelAdmin):
    44     class StudentInline(admin.StackedInline):  # 必须这么继承,当然这个类也可以写在ClassesModelAdmin外面
    45         """
    46         这两个就样式不同而已
    47             admin.StackedInline: 竖着
    48             admin.TabularInline: 横着
    49         """
    50         extra = 1  # 默认一次性添加几条记录
    51         model = models.Students
    52 
    53     inlines = [StudentInline]
    复制代码

    显示效果

     

     

     

     

     

    8.simple-ui:美化页面

    详细请见:https://simpleui.72wo.com/docs/simpleui/

    安装:

    pip install django-simpleui

    配置

    复制代码
      INSTALLED_APPS = [
          'simpleui',
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          ...
      ]
    复制代码

     

    页面如下

     

    9.源码分析

    admin是Djanog中的一个app,既然这样,那么它也会有自己的路由和视图

    这里面发现了懒加载和单例模式

    • Django在加载的时候,会将每一个app中的admin文件

       

       

       

       

       

       

    • 我们会将希望纳入管理的表放在此处,调用adin的注册函数进行注册

       

       

       

       

    • Django然后会加载路由,路由的加载如下

       

       

     

    在这个源码中我们可以看到熟悉的路由和视图了

  • 相关阅读:
    类和对象的知识点补充
    LeetCode题-回文数-2023/9/11
    MySQL数据库介绍
    定时任务cron与crontab
    linux shell环境下处理yml文件
    一键抓取网页的所有图片
    在模块中使用外部依赖的类
    哪家堡垒机支持国密算法?有哪些功能?
    DGIOT 智慧车间机床设备数据采集
    【21天学习挑战赛】Python学习第二篇:json标准库
  • 原文地址:https://www.cnblogs.com/victor1234/p/16902211.html