PYTHON收藏收藏Python

简易版django实现学生信息管理系统

2021-11-12  本文已影响0人  D_w

该项目的思路是利用将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上的按钮下载所需三方库


image.png

接下来在cmd窗口或pycharm的Teminal窗口中执行下列操作。

  1. 构建django项目
django-admin startproject django_demo
  1. 生成应用
cd django_demo
python manage.py startapp student
  1. 在项目中注册应用,打开项目包文件中的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'
]
image.png
  1. 初始化数据库,这里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',
    }
}
image.png

这里需要注意下,首先得创建好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 = '<input type="button" value="点我弹出" onclick="javascript:alert(\''+self.studentName+'\');"/>'
        # 返回一个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
image.png
在浏览器中打开http://127.0.0.1:8000/admin/ ,得到界面
image.png
输入刚刚设置好的用户名和密码,登录
image.png
界面目前还有英文,因此在settings.py中LANGUAGE_CODE和TIME_ZONE字段的值改为
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

重新刷新界面,语言已设置为中文,


image.png
image.png

这样基本功能就完成了

上一篇下一篇

猜你喜欢

热点阅读