尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Django学生管理系统实战:从模型设计到Linux部署

Django学生管理系统实战:从模型设计到Linux部署 简介这是一套面向计算机专业本科生的Django框架毕设级学生信息管理系统完整实现方案涵盖毕业论文与可运行源码适用于课程设计、毕业设计参考及Web开发入门实践。资源包含190个文件以25个Python后端逻辑文件、35个HTML前端模板、44个编译后的pyc字节码为主辅以Bootstrap与Font Awesome等CSS/JS资源如bootstrap.min.css、font-awesome.css、nav.css等构建起完整的前后端分离式管理界面数据库采用轻量级SQLite3便于本地快速部署。压缩包仅4.38MB结构清晰含需求分析、技术选型、功能树与数据库设计、界面与程序实现、系统测试报告等完整开发文档链路。目前已有7471人学习下载读者可直接运行调试、理解MVT架构落地细节、掌握用户权限管理与CRUD操作实现并复用其模块化目录结构与响应式UI设计思路。1. 这不是又一个“增删改查”DemoDjango学生信息管理系统的真实落地场景与毕业设计分水岭很多同学拿到“基于PythonDjango学生信息管理系统”这个毕设题目时第一反应是不就是用models.py建几个表、views.py写几个函数、urls.py配几条路由但实际答辩现场被问倒的恰恰是那些能跑通却答不出“为什么用Django而不是Flask”“字段为什么设为nullTrue, blankTrue”“列表页分页用django.core.paginator还是第三方库”的人。这个系统本质是一次完整的Web工程实践切片从数据库关系建模如班级-学生-课程的多对多嵌套、权限分级管理员/教师/学生视图隔离、数据校验学号唯一性、身份证格式、成绩区间约束到部署验证本地开发环境与Linux服务器配置差异。它面向的是高校教务管理中的真实痛点——比如批量导入Excel学籍数据时如何避免事务中断导致脏数据或导出成绩单PDF时中文乱码的字体路径处理。适合计算机、软件工程、教育技术等专业本科生尤其需要体现工程规范性而非仅功能堆砌。2. 用Django 4.2Python 3.10构建最小可运行骨架从虚拟环境到admin后台可视化2.1 创建隔离环境并安装核心依赖毕业设计必须规避全局Python环境污染这是答辩时导师常检查的基础项。使用venv创建独立环境明确指定Python版本避免Django 4.x与Python 3.9以下兼容性问题# 创建项目目录并进入 mkdir student_mgmt cd student_mgmt # 基于Python 3.10创建虚拟环境Windows用python -m venv venvLinux/macOS用python3.10 -m venv venv python3.10 -m venv venv # 激活环境Linux/macOS source venv/bin/activate # Windows用户执行venv\Scripts\activate.bat # 升级pip并安装Django 4.2当前LTS版本兼容性与安全更新有保障 pip install --upgrade pip pip install Django4.2,4.3提示pip install Django4.2,4.3使用版本范围而非固定版本既锁定LTS大版本避免意外升级又允许接收4.2.x的安全补丁更新。若使用pip install django可能安装最新5.x版导致django.contrib.auth中AbstractBaseUser方法签名变更引发兼容问题。2.2 初始化Django项目与核心App结构Django项目需严格区分“项目”配置中心与“应用”功能模块。学生管理系统应拆分为core基础模型、student学生业务、course课程管理三个App避免单App臃肿# 创建Django项目项目名student_project非应用名 django-admin startproject student_project . # 创建student应用注意末尾的点表示在当前目录生成 python manage.py startapp student # 同理创建course和core应用 python manage.py startapp course python manage.py startapp core2.2.1 配置文件关键修改在student_project/settings.py中注册App并配置数据库# INSTALLED_APPS中添加新App按依赖顺序 INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, # 自定义App核心模型放最前 core, student, course, ] # 数据库配置毕业设计推荐SQLite零配置部署 DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite3, # 路径自动拼接无需手动写绝对路径 } } # 时区与语言中文支持必需 LANGUAGE_CODE zh-hans TIME_ZONE Asia/Shanghai USE_I18N True USE_TZ True2.3 定义学生核心模型并激活admin后台core/models.py中定义基类模型student/models.py继承实现具体业务# core/models.py from django.db import models class TimeStampedModel(models.Model): 时间戳基类所有模型继承以自动记录创建/更新时间 created_at models.DateTimeField(auto_now_addTrue) updated_at models.DateTimeField(auto_nowTrue) class Meta: abstract True # 标记为抽象基类不生成数据库表 # student/models.py from django.db import models from core.models import TimeStampedModel class Student(TimeStampedModel): GENDER_CHOICES [ (M, 男), (F, 女), (O, 其他), ] student_id models.CharField(max_length12, uniqueTrue, verbose_name学号) # 学号唯一性约束 name models.CharField(max_length50, verbose_name姓名) gender models.CharField(max_length1, choicesGENDER_CHOICES, verbose_name性别) id_card models.CharField(max_length18, blankTrue, nullTrue, verbose_name身份证号) # 允许为空 enrollment_date models.DateField(verbose_name入学日期) def __str__(self): return f{self.name}({self.student_id}) class Meta: verbose_name 学生 verbose_name_plural 学生管理2.3.1 生成并执行迁移模型定义后必须生成迁移文件再应用到数据库# 生成迁移文件检查输出是否包含student.Student的CREATE TABLE python manage.py makemigrations # 执行迁移创建数据库表 python manage.py migrate # 创建超级用户用于admin登录 python manage.py createsuperuser2.3.2 注册模型到admin后台student/admin.py中启用可视化管理from django.contrib import admin from .models import Student admin.register(Student) class StudentAdmin(admin.ModelAdmin): list_display (student_id, name, gender, enrollment_date, created_at) list_filter (gender, enrollment_date) # 右侧筛选栏 search_fields (student_id, name, id_card) # 顶部搜索框 date_hierarchy enrollment_date # 按日期层级导航 # 字段分组显示提升录入体验 fieldsets ( (基本信息, {fields: (student_id, name, gender)}), (证件信息, {fields: (id_card,)}), (入学信息, {fields: (enrollment_date,)}), )注意list_display中不能直接写__str__必须用模型字段或自定义方法。date_hierarchy要求字段类型为DateField或DateTimeField否则报错。3. 实现学生信息CRUD接口从URL路由到模板渲染的完整链路3.1 设计RESTful风格URL路由遵循Django最佳实践将URL定义分散到各App的urls.py中主路由student_project/urls.py聚合# student/urls.py from django.urls import path from . import views urlpatterns [ path(, views.student_list, namestudent_list), # 列表页 path(add/, views.student_add, namestudent_add), # 新增页 path(int:pk/edit/, views.student_edit, namestudent_edit), # 编辑页 path(int:pk/delete/, views.student_delete, namestudent_delete), # 删除页 ]# student_project/urls.py主路由 from django.contrib import admin from django.urls import path, include urlpatterns [ path(admin/, admin.site.urls), path(student/, include(student.urls)), # 包含student应用路由 ]3.2 编写视图函数处理业务逻辑student/views.py中实现四个核心操作重点处理表单验证与重定向from django.shortcuts import render, get_object_or_404, redirect from django.http import HttpResponse from .models import Student from .forms import StudentForm # 表单类见3.3节 def student_list(request): students Student.objects.all().order_by(student_id) return render(request, student/list.html, {students: students}) def student_add(request): if request.method POST: form StudentForm(request.POST) if form.is_valid(): form.save() # 自动调用模型save()方法 return redirect(student_list) # 重定向避免重复提交 else: form StudentForm() return render(request, student/form.html, {form: form, title: 新增学生}) def student_edit(request, pk): student get_object_or_404(Student, pkpk) # 404处理替代try-except if request.method POST: form StudentForm(request.POST, instancestudent) # 绑定现有实例 if form.is_valid(): form.save() return redirect(student_list) else: form StudentForm(instancestudent) # 预填充表单 return render(request, student/form.html, {form: form, title: 编辑学生}) def student_delete(request, pk): student get_object_or_404(Student, pkpk) if request.method POST: student.delete() return redirect(student_list) return render(request, student/confirm_delete.html, {student: student})3.2.1 关键参数说明get_object_or_404(Student, pkpk)比Student.objects.get(pkpk)更安全对象不存在时返回404而非500错误符合Web标准。redirect(student_list)使用命名URL而非硬编码路径便于后期路由重构。form.save()Django ModelForm自动处理字段映射与保存避免手写SQL插入。3.3 构建ModelForm实现表单验证student/forms.py中定义表单复用模型字段并添加业务规则from django import forms from .models import Student class StudentForm(forms.ModelForm): class Meta: model Student fields [student_id, name, gender, id_card, enrollment_date] widgets { enrollment_date: forms.DateInput(attrs{type: date}), # HTML5日期控件 } def clean_student_id(self): 自定义学号校验长度为10-12位数字 sid self.cleaned_data[student_id] if not sid.isdigit() or not (10 len(sid) 12): raise forms.ValidationError(学号必须为10-12位纯数字) return sid def clean_id_card(self): 身份证号基础校验毕业设计级别 cid self.cleaned_data.get(id_card) if cid and len(cid) ! 18: raise forms.ValidationError(身份证号应为18位) return cid3.4 开发前端模板实现用户交互student/templates/student/list.html展示表格!-- student/templates/student/list.html -- h2学生信息列表/h2 a href{% url student_add %} classbtn btn-primary新增学生/a table classtable thead tr th学号/thth姓名/thth性别/thth入学日期/thth操作/th /tr /thead tbody {% for s in students %} tr td{{ s.student_id }}/td td{{ s.name }}/td td{{ s.get_gender_display }}/td !-- 使用choices的显示值 -- td{{ s.enrollment_date|date:Y-m-d }}/td td a href{% url student_edit s.pk %}编辑/a | a href{% url student_delete s.pk %}删除/a /td /tr {% endfor %} /tbody /table注意{{ s.get_gender_display }}自动将M转换为男这是Django对choices字段的内置支持避免在模板中写if判断。4. 解决毕业设计高频痛点Excel批量导入、PDF导出与部署验证4.1 实现Excel学籍数据批量导入手动录入百条数据不现实需支持.xlsx文件解析。安装openpyxlDjango官方推荐pip install openpyxlstudent/views.py中添加导入视图import openpyxl from django.contrib import messages def student_import(request): if request.method POST and request.FILES.get(excel_file): excel_file request.FILES[excel_file] try: # 读取Excel文件openpyxl不支持流式读取需先保存临时文件 wb openpyxl.load_workbook(excel_file) ws wb.active imported_count 0 for row in ws.iter_rows(min_row2, values_onlyTrue): # 跳过标题行 if not row[0]: # 学号为空则跳过 continue # 创建学生对象此处简化实际需处理异常 Student.objects.create( student_idstr(row[0]).strip(), namestr(row[1]).strip(), genderrow[2] if row[2] in [M,F,O] else O, enrollment_daterow[3], # Excel日期自动转datetime ) imported_count 1 messages.success(request, f成功导入{imported_count}条学生数据) except Exception as e: messages.error(request, f导入失败{str(e)}) return redirect(student_list) return render(request, student/import.html)4.1.1 导入模板页面student/templates/student/import.htmlh2Excel批量导入/h2 form methodpost enctypemultipart/form-data {% csrf_token %} input typefile nameexcel_file accept.xlsx,.xls required button typesubmit上传并导入/button /form p模板要求第1行标题学号、姓名、性别、入学日期第2行起数据/p4.2 生成带中文的PDF成绩单使用weasyprint轻量级无需外部服务pip install weasyprintstudent/views.py中添加PDF生成from weasyprint import HTML from django.http import HttpResponse def student_pdf(request, pk): student get_object_or_404(Student, pkpk) # 渲染PDF专用模板student/templates/student/pdf.html html_string render_to_string(student/pdf.html, {student: student}) html HTML(stringhtml_string) # 中文字体支持需提前下载simhei.ttf到static/fonts/ font_config FontConfiguration() pdf_file html.write_pdf( font_configfont_config, stylesheets[CSS(stringfont-face { font-family: SimHei; src: url(/static/fonts/simhei.ttf); } body { font-family: SimHei; })] ) response HttpResponse(pdf_file, content_typeapplication/pdf) response[Content-Disposition] finline; filename{student.name}_成绩单.pdf return response提示weasyprint依赖系统字体库Linux服务器需安装fonts-wqy-zenheiUbuntu或wqy-zenhei-fontsCentOS否则中文显示为方块。4.3 在Linux服务器部署验证宝塔面板实操毕业设计需证明可部署宝塔是最常用方案上传代码通过宝塔文件管理器上传student_project目录不含venv和db.sqlite3创建Python项目宝塔 → Python项目 → 填写项目路径/www/wwwroot/student_project运行目录/www/wwwroot/student_projectPython版本选择已安装的3.10启动文件student_project/wsgi.py运行模式gunicorn比默认uWSGI更易配置安装依赖在宝塔终端执行cd /www/wwwroot/student_project source /www/server/python/bin/activate # 宝塔Python环境 pip install Django4.2,4.3 openpyxl weasyprint配置静态文件在宝塔网站设置 → 网站目录 → 设置/static/指向/www/wwwroot/student_project/static/收集静态文件python manage.py collectstatic --noinput4.3.1 部署后必查项检查点命令/操作预期结果数据库迁移python manage.py migrate输出Operations to perform:且无错误静态文件路径访问http://your-domain/static/admin/css/base.css返回CSS内容非404admin后台访问http://your-domain/admin/显示登录页输入createsuperuser账号可登录5. 毕业答辩前的3个提分技巧性能优化、安全加固与文档规范5.1 用select_related优化关联查询性能当学生列表需显示所属班级假设扩展了Class模型避免N1查询# 错误写法每行学生触发一次班级查询 students Student.objects.all() for s in students: print(s.class_name.name) # 触发额外SQL # 正确写法单次JOIN查询 students Student.objects.select_related(class_name).all() for s in students: print(s.class_name.name) # 无额外查询在student/views.py中应用def student_list(request): # 假设Student模型有class_name外键 students Student.objects.select_related(class_name).all().order_by(student_id) return render(request, student/list.html, {students: students})5.2 添加CSRF保护与XSS过滤Django默认开启CSRF但模板中必须显式声明!-- student/templates/student/form.html -- form methodpost {% csrf_token %} !-- 此行不可省略 -- {{ form.as_p }} button typesubmit提交/button /form对用户输入内容如学生姓名在模板中自动转义!-- 安全自动转义HTML特殊字符 -- td{{ s.name }}/td !-- 如需渲染HTML极少数场景明确标记安全 -- td{{ s.bio|safe }}/td !-- 仅当bio由可信来源生成时使用 --5.3 毕业论文配套文档清单答辩加分项导师关注工程完整性提供以下文档可显著提升评分文档类型存放位置关键内容数据库ER图docs/er_diagram.png使用draw.io绘制标注主外键、基数1:NAPI接口文档docs/api_spec.md列出所有URL、请求方法、参数示例如POST /student/add/传{name:张三}部署手册docs/deploy_guide.md分步骤说明环境要求→依赖安装→数据库初始化→启动命令测试用例表docs/test_cases.xlsx包含用例编号、操作步骤、预期结果如“输入学号123456789012应提示‘学号长度超限’”注意test_cases.xlsx需覆盖边界值学号10位/12位、异常流程空学号提交、重复学号这是答辩时验证“测试意识”的直接证据。本文还有配套的精品资源点击获取
返回列表