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然后会加载路由,路由的加载如下
在这个源码中我们可以看到熟悉的路由和视图了