Django Admin管理工具
Django Admin管理站点
admin模块是Django最强大的部分之一,它从模型中读取元数据,快速生成以数据模型为中心的界面,通过授权用户来管理站点的内容。admin仅用于后台数据管理,并非用于构建整个前端。
配置Django Admin
Django Admin默认配置为默认启用的。在setting.py可以看到
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',]
- django.contrib是一套庞大的功能集,它是Django基本代码的组成部分。
激活管理工具
Django的访问逻辑为通过urls.py的配置访问到指定的模块。
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
至此,Django Admin已配置完成。
使用管理工具
通过python manage.py runserver 0.0.0.0:8000启动Django应用,访问http://127.0.0.1:8000/admin/,可看到如下界面:

创建登录用户
可以通过命令 python manage.py createsuperuser 来创建超级用户
$ python3 manage.py createsuperuser
Username (leave blank to use 'yull'): admin
Email address: admin@admin.com
Password:
Password (again):
Superuser created successfully.
此时,通过生成的用户名密码即可登录管理站点

Admin管理工具优化
通过学生表和班级表示例来演示Django管理工具的使用和优化。
创建Django项目
python-admin startproject mysite
python manage.py startapp myapp
引入myapp
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp', #添加myapp应用
]
配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_myapp',
'USER': 'uospuser',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
# 登录mysql创建数据库
create database db_myapp;
创建数据模型
在myapp应用中的models.py创建班级表和学生表的数据模型
from django.db import models
class Classes(models.Model):
cname = models.CharField(max_length=32, verbose_name='班级名称', null=False)
cnum = models.IntegerField(null=True, verbose_name='总人数')
status= models.BooleanField(verbose_name='状态', null=False)
createtime = models.DateTimeField(verbose_name='创建时间', null=False)
class Meta:
db_table = "t_classes"
class Student(models.Model):
sname = models.BooleanField(verbose_name='服务状态', null=False)
gender = models.IntegerField(verbose_name='性别', null=False)
age = models.IntegerField(verbose_name='年龄', null=False)
grade = models.CharField(max_length=32, null=False, verbose_name='成绩')
classname = models.ForeignKey('Classes', on_delete=models.CASCADE)
class Meta:
db_table = "t_students"
- 如果不添 db_table = “t_classes” 默认会生成 应用名_类名 (myapp_classes)的表名
生成数据表
生成迁移文件
$ python3 manage.py makemigrations
Migrations for 'myapp':
myapp/migrations/0001_initial.py
- Create model Classes
- Create model Student
python3 manage.py makemigrations 会在myapp下的migrations中生成迁移文件,此时,数据模型还没有更新到数据库中,需要进行保存操作。
更新至数据库
$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying myapp.0001_initial... OK
Applying sessions.0001_initial... OK
更新完成后可以在mysql中查询到生成的数据表

配置Django Admin管理数据表
可以看到前面打开的admin管理平台只有Groups和Users表,这两张表是Django自动创建的,用于保存admin用户信息的表,我们自己生成的班级表和学生表还不能通过Admin管理。
修改 myapp/admin.py
from django.contrib import admin
from myapp.models import (Classes, Student) # 引入数据源
admin.site.register(Classes) #注册到admin管理工具
admin.site.register(Student)
重启应用可以刷新页面即可看到相对应的班级表和学生表。

中文语言支持
Django admin默认语言是英文,可以修改为中文,在settings.py中修改:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
修改页面标题
admin后台提供修改页面标题的功能,在admin.py下面添加
admin.site.site_header = 'MyApp'
admin.site.site_title = 'MyApp'
修改默认显示
修改默认表名显示
默认站点首页会显示models中对象的名称,可以通过在models类中增加下面两行修改默认显示名称
verbose_name = ‘班级表’
verbose_name_plural = verbose_name
from django.db import models
class Classes(models.Model):
......
class Meta:
verbose_name = '班级表' # 增加可读的名称
verbose_name_plural = verbose_name
db_table = "t_classes"
class Student(models.Model):
......
class Meta:
verbose_name = '学生表'
verbose_name_plural = verbose_name
db_table = "t_students"
重新生成数据库迁移文件并保存至数据库刷新页面即可看到中文显示。

数据页优化
可以通过在admin.py中增加一个模型管理的类来进行个性化设置。
from django.contrib import admin
from cnc_template.models import Classes
#增加以下内容
class ClassesAdmin(admin.ModelAdmin):
# 自定义显示内容,当status字段为真时显示为开班,否则显示为未开班
def statusDisplay(self):
if self.status:
return "开班"
else:
return "未开班"
list_display = ('id', 'cname', 'cnum', 'status', 'createtime') # 设置要显示在列表中的字段
list_per_page = 10 # 设置每页显示的数据
list_filter = ('cname',) # 过滤器
ordering = ('id',) # 设置默认排序字段
list_editable = ['cname',] #设置默认可编辑字段,要求元祖或者列表
fk_fields = ('machine_room_id',) # 设置显示外键
list_display_links = ['id', 'cname'] # 设置哪些字段可以进入编辑页面,默认只有id
search_fields = ('id', 'cname') # 搜索字段
admin.site.register(Classes, ClassesAdmin)
- list_editable和list_display_links不可使用同一字段
通过上面的自定义,页面显示如下:

添加修改页优化
在上面数据优化操作后,还可以对增加数据的时候进行优化
class ClassesAdmin(admin.ModelAdmin):
......
fields = ['cnum', 'cname', 'status', 'createtime'] # 修改增加时显示顺序
fieldsets = [
("base", {"fields":["cname", "createtime"]}),
("num", {"fields": ["cnum", "status"]})
] # 修改增加数据时分组显示
- fields和fieldsets不可同时使用
关联对象
需求:在创建一个班级时,可以直接添加若干个学生
在admin.py中增加如下代码。
class StudentsInfo(admin.TabularInline):
model = Student
extra = 2 # 创建时新增两行
class ClassesAdmin(admin.ModelAdmin):
......
inlines = [StudentsInfo] #关联StudentsInfo对象
- admin.TabularInline:创建时横向显示列名
- admin.StackedInline:创建时竖向显示列名
修改后,在创建班级时就可以同时创建两个学生

模型注册到Admin管理工具方式
模型注册到Admin管理工具有两种方式
- admin.site.register
- 装饰器方式
# admin.site.register方式
class ClassesAdmin(admin.ModelAdmin):
......
admin.site.register(Classes, ClassesAdmin)
# 装饰器方式
@admin.register(Classes)
class ClassesAdmin(admin.ModelAdmin):
......
上传图片
- 安装Python图像处理库PIL
pip install Pillow
- 修改models.py,使用图片空间ImageField
image = models.ImageField(upload_to='images', blank=True)
- 修改settings.py,STATIC_ROOT和MEDIA_ROOT需要设置不同路径
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/upload/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
# 需先创建upload目录
