该项目的思路是利用将django的超级管理员登录页面改造成学生信息管理系统,因此没有用到views.py和模板,该项目的文件结构如下
- django-admin-demo # 项目所在文件夹,里面存放该项目需要的三方库和项目
- django_demo # django项目所在文件夹,文件夹名随便起,使用该命令创建 django-admin startproject django_demo
- django_demo # 这是一个python包,内部所有文件都是上面命令创建出来的,该包与前一个文件夹同名
- _init_.py # 申明包
- asgi.py # 作为你的项⽬的运⾏在 ASGI 兼容的 Web 服务器上的入口。使⽤ ASGI 来部署的时候使⽤。
- settings.py # Django 项⽬的配置⽂件。
- urls.py # Django 项⽬的 URL 声明,就像你⽹站的“⽬录”。
- wsgl.py # 作为你的项⽬的运⾏在 WSGI 兼容的Web服务器上的入口。使⽤使⽤ WSGI 进⾏部署的时候使⽤。
- student.py # 使用 python manage.py startapp student ,生成一个student应用
- migrations # 一个python包,目前发现时存放数据库相关内容
- __init__.py # 申明是个包
- admin.py # 自定义Django管理工具
- apps.py # Django应用的配置文件
- models.py # 模型管理文件
- tests.py # 测试文件
- views.py # 视图管理文件
- manage.py # ⼀个让你⽤各种⽅式管理 Django 项⽬的命令⾏⼯具
- venv # 虚拟环境文件
- requirements.txt # 管理三方库文件
初始化应用与数据库
首先新建一个python项目django-admin-demo,在该目录下创建一个requirements.txt,内容如下:
# 所需要的依赖
# web框架
django==3.2.4
django-bootstrap4==3.0.1
django-simpleui==2021.6.2
# 专门解决 多层嵌套页面展示问题
django-nested_admin==3.3.3
# 数据库操作
pymysql==1.0.2
mysqlclient
sqlalchemy==1.4.18
# yaml文件操作
PyYaml
创建好后在pycharm中打开该文件,点击pycharm上的按钮下载所需三方库
接下来在cmd窗口或pycharm的Teminal窗口中执行下列操作。
- 构建django项目
django-admin startproject django_demo
- 生成应用
cd django_demo
python manage.py startapp student
- 在项目中注册应用,打开项目包文件中的setting.py文件,在INSTALLED_APPS列表中添加如下信息
INSTALLED_APPS = [
'student',
'simpleui',
'nested_admin',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles'
]
- 初始化数据库,这里django默认使用的是sqlite3,我改为了mysql,将项目包中setting.py文件内的DATABASES内容改为
DATABASES = { # 这里使用mysql数据库,首先得连接,然后新建一个名为django-demo的schema
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django-demo',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
这里需要注意下,首先得创建好django-demo这个数据库才能进行下列操作
python manage.py migrate # 同步数据库内容/创建
python manage.py makemigrations # 构建数据更新内容
定义模型
models.py文件内容如下
from django.db import models
# Create your models here.
from django.utils.html import format_html # 个人理解就是将format_html后跟的字符串以HTML输出
class Student(models.Model):
"""
学员信息 [表定义,相关一些操作]
"""
studentName = models.CharField('学员姓名', max_length=255)
studentAge = models.IntegerField('学员年龄', null=True, blank=True)
class Meta: # 这里是Django的用法,给model定义元数据
verbose_name = '学员信息管理' # 给模型类起个别名
verbose_name_plural = '学员信息管理' # 指定模型的复数形式是什么
# 行级按钮/操作定义 -- 处理一条记录
def alert(self):
# 此处你想展示什么,就写什么html代码
btn = ''
# 返回一个html信息对象
return format_html(btn)
alert.short_description='操作'
def __str__(self): # 类中如果定义了__str__方法,print打印对象时就会输出这个函数返回的字符串
return self.studentName
class Contact(models.Model):
"""
联系方式表,和学生有关联
"""
info = models.CharField('联系方式', max_length=16)
Student = models.ForeignKey("Student", on_delete=models.CASCADE, verbose_name="学生信息")
class Meta:
verbose_name = '联系方式'
verbose_name_plural = '联系方式列表' # 复数 -- 展示多个的时候
def __str__(self): # 类中如果定义了__str__方法,print打印对象时就会输出这个函数返回的字符串
return ''
class ExamInfo(models.Model):
"""
考试信息表
"""
score = models.IntegerField('考试总分')
remark = models.CharField('备注', max_length=16)
Student = models.ForeignKey("Student", on_delete=models.CASCADE, verbose_name="学生信息")
class Meta:
verbose_name = '考试信息'
verbose_name_plural = '考试信息列表' # 复数 -- 展示多个的时候
def __str__(self):
return ''
class ExamDetailInfo(models.Model):
"""
考试信息详情表
"""
score = models.IntegerField('分数')
className = models.CharField('科目', max_length=16)
ExamInfo = models.ForeignKey("ExamInfo", on_delete=models.CASCADE, verbose_name="考试记录")
class Meta:
verbose_name = '考试详情'
verbose_name_plural = '考试详情' # 复数 -- 展示多个的时候
def __str__(self):
return ''
在models.py中设计了Student、Contact、Examinfo、ExamDetailInfo四张表,其中Contact和ExamInfo的student字段为Student表的外键,ExamDetailInfo的ExamInfo字段是ExamInfo表的外键,在Student表中添加了alert按键,点击后展示学生名。
定义后台文件
在admin.py文件中写入如下
import nested_admin
from django.contrib import admin
# Register your models here.
from .models import Student, Contact, ExamInfo, ExamDetailInfo
# TabularInline 表格形式的展示,一行一行
class ContactAdmin(nested_admin.NestedTabularInline): # 联系方式
# 指定要展示哪些内容
list_display = ['id', 'info']
model = Contact
extra = 0 # 表格默认展示几行
class ExamDetailInfoAdmin(nested_admin.NestedTabularInline): # 考试详情
model = ExamDetailInfo
extra = 0 # 表格默认展示几行
# NestedStackedInline 【上下排版】
class ExamInfoAdmin(nested_admin.NestedStackedInline): # 考试信息
model = ExamInfo
extra = 0 # 表格默认展示几行
inlines = [ExamDetailInfoAdmin]
# ModelAdmin 常规展示【上下排版】
class StudentAdmin(nested_admin.NestedModelAdmin): # 学员信息管理
"""
学员信息
"""
# 指定要展示哪些内容
list_display = ['id', 'studentName', 'studentAge', 'alert']
model = Student
inlines = [ContactAdmin, ExamInfoAdmin] #-- 嵌套一个 联系方式的维护页面
actions = ['test_btn'] # 按钮定义
@admin.action(permissions=['change']) # 权限定义
def test_btn(self, httprequest, queryset):
# 此处可以进行数据库操作等等...
print('请求信息:', httprequest)
print('页面选择的数据信息:', queryset)
self.message_user(httprequest, '执行成功') # 弹出一个对话框给前端提示
test_btn.short_description = '执行测试用例'
test_btn.confirm = '这是一个对话框,你确定要执行这个按钮的动作嘛?'
admin.site.register(Student, StudentAdmin)
# admin.site.register(Contact, ContactAdmin) # 此页面已经被嵌套在学生信息界面,不需要独立成为一个页面了
在admin.py文件中对刚创建models.py中的表进行自定义管理,一般表其对应的自定义样式的类命名为表名+Admin, list_display属性可以指定该页面的显示,inlines可以指定某些信息在该表所在页面内部显示
创建超级用户
在cmd窗口或pycharm的teminal窗口中进入到django_demo目录中,输入
python manage.py createsuperuser
然后依次输入用户名、邮箱(可不填直接回车)、密码、确定密码,最后输入y设置完毕,然后启动服务
python manage.py runserver
在浏览器中打开http://127.0.0.1:8000/admin/ ,得到界面
输入刚刚设置好的用户名和密码,登录
界面目前还有英文,因此在settings.py中LANGUAGE_CODE和TIME_ZONE字段的值改为
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
重新刷新界面,语言已设置为中文,
这样基本功能就完成了