[Python + Django] Web在线考试管理系统设计及代码实现
本文最終實現一個Web在線考試管理系統,可作為Python Web,Django的練手項目,也可以作為計算機畢設參考項目。
源碼獲取方式:【Django】pythonweb學生信息及考試管理系統畢業設計源碼-Python文檔類資源-CSDN下載
目錄
系統功能需求分析
系統設計及實現思路
1、數據庫設計
2、頁面及功能設計
系統實現過程及源碼
1 開發環境搭建及技術選型
2、Django項目創建及數據庫連接配置
3、 數據庫創建和連接配置
數據庫創建
Django數據庫連接配置
4、 功能模塊詳細開發
創建APP
注冊APP
定義模型
定義視圖函數
配置訪問路由URL
靜態資源準備及配置
模板創建
Django后臺啟用配置
運行服務器測試效果
系統功能需求分析
在線考試管理系統,主要包含如下幾個功能模塊:
1、用戶登錄及:實現簡單的登錄及驗證
2**、個人信息展示**:展示考生個人信息
3、考試管理:展示可以考試的試卷,考試及自動計算考試成績。
4、考試成績管理:展示考試結果
5、后臺基礎數據管理:試卷,試題,考生等信息更新維護。
系統設計及實現思路
系統設計包括三部分:數據庫設計,功能函數視圖設計,前端頁面設計
1、數據庫設計
根據我們的的系統需求分析,我們預計需要如下幾個數據表:
- 學院表:Academy
- 專業表:Major
- 課程表:Course
- 學生表:Student
- 題庫表:QuestionBank
- 試卷表:TestPaper
- 學生成績表:Record
2、頁面及功能設計
為了實現我們前面的功能模塊我們設計如下幾個功能頁面:
1、登錄頁面:
其中需要登錄,校驗,登錄后同時需要存儲用戶信息在Session中,以備登錄后的頁面使用。
2、首頁(考試信息頁):
頁面需要顯示當前用戶可以參考的考試試卷信息,在此頁面點擊開始考試可以跳轉到考試頁面。
3、考試頁面:
展示對應試卷的題目和選項信息,同時可以進行答題,交卷后可以自動計算考試分數并存入數據庫。
4、成績顯示頁面:
展示對應考試的考試結果
5、后臺管理:
用于管理我們的專業,考生,試卷,題庫等基礎信息,為了快速實現系統我們將直接啟用Django自帶的Admin管理功能。
6、個人詳情:
用于展示個人詳情信息。
系統實現過程及源碼
大致理清了我們需要實現的功能模塊之后,我們開始擼代碼
1 、開發環境搭建及技術選型
服務端:Python 3.8
Web框架:Django 3.2
數據庫:MySQL mysql-8.0.13-winx64
開發工具IDE:Pycharm(社區版)
前端框架:Bootstrap 4
2、Django項目創建及數據庫連接配置
1.在任意盤符文件夾下新建一個空白Pycharm項目文件夾比如:PycharmProjects
2.打開Pycharm,進入空白文件夾:PycharmProjects
3.通過Pycharm 的Windows 命令行輸入界面輸入創建Django項目的命令,創建一個新的項目: DjangoExam
django-admin startproject DjangoExam3、 數據庫創建和連接配置
Django 對各種數據庫提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。
Django 為這些數據庫提供了統一的調用API。
我們可以根據自己業務需求選擇不同的數據庫。
MySQL 是 Web 應用中最常用的數據庫。
本文采用MySQL。
此步驟將數據庫設置連接到自己的MySQL數據庫,并完成數據庫的創建.
數據庫創建
Django只能操作到數據表級別,不能操作到數據庫級別,所以需要手工創建一個數據庫:djangoexam
我們可以通過命令行創建一個數據庫:
1.進入mysql安裝文件夾的bin 子文件夾目錄:
比如:D:Program Filesmysql-8.0.13-winx64in
2.連接數據庫:
mysql -u root -p Enter password:******
3.連接登錄成功后通過命令創建一個數據庫:djangoexam
CREATE DATABASE IF NOT EXISTS djangoexam DEFAULT CHARSET utf8;
或者通過SQLlog工具創建一個數據庫: djangoexam
Django數據庫連接配置
Django使用MySQL需要mysql 驅動,如果你沒安裝 mysql 驅動,可以執行以下命令安裝:
pip install pymysql安裝好之后,進入DjangoExam 項目下的DjangoExam 文件夾,打開setting.py 文件,找到DATABASES配置項,修改DATABSES配置項為如下內容:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 數據庫引擎'NAME': 'djangoexam', # 數據庫名稱'HOST': '127.0.0.1', # 數據庫地址,本機 ip 地址 127.0.0.1'PORT': 3306, # 端口'USER': 'root', # 數據庫用戶名'PASSWORD': '123456', # 數據庫密碼} }然后使用 pymysql 模塊連接 mysql 數據庫:
在與 settings.py 同級目錄下的 __init__.py 中引入模塊和進行配置:
import pymysql pymysql.install_as_MySQLdb()至此,我們創建了一個Django項目DjangoExam用于我們后續的在線考試管理系統開發的程序編寫。
同時為此項目創建了一個MySQL數據庫:djangoexam用于我們程序開發過程中的數據存放和處理。
4、 功能模塊詳細開發
一個Django項目框架搭建起來后,我們所有對系統的前后臺所有的程序開發都可以在這個項目中進行了,一個典型的Django項目模塊功能的開發包括如下幾個步驟:
- 創建app
- 注冊app
- 定義模型
- 定義視圖函數
- 配置訪問路由URL
- 靜態資源準備及配置
- 前端模板開發
- 測試及運行
創建APP
在Django中的一個app代表一個功能模塊,Django 規定,如果要使用模型,必須要創建一個 app。
本來一般實際開發中方便管理一個功能模塊需要單獨新建一個app,我們為了快速開發,所有的功能和模型都在一個app中進行管理。
在命令行中輸入python manage.py startapp exam指令,創建名為exam的app:
python manage.py startapp exam注冊APP
在 DjangoExam文件夾目錄下的settings.py 中找到INSTALLED_APPS配置項,將新創建的exam添加到項目的app列表,如下:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','exam', #添加此項 ]定義模型
我們之前創建了一個空白的數據庫djangoexam,這一步我們通過Django的模型來完成數據庫表的創建.
因為Django對模型和目標數據庫之間有自身的映射規則,如果自己在數據庫中創建數據表,可能不一定符合Django的建表規則,從而導致模型和目標數據庫無法建立通信聯系。
所以最好我們在Django項目中還是通過Django模型來創建對應數據庫表
一個表對應一個模型,本步驟按照我們前面數據庫設計需要設計7個模型:
打開exam/models.py文件,輸入如下代碼:
from django.db import models# 學院表 class Academy(models.Model):id = models.AutoField('序號',primary_key=True)name = models.CharField('學院',max_length=20)# 修改顯示的表的名字class Meta:verbose_name = '學院'verbose_name_plural = '學院'def __str__(self):return self.name# 專業表 class Major(models.Model):id = models.AutoField('序號',primary_key=True)academy = models.ForeignKey(Academy,on_delete=models.CASCADE,verbose_name='學院')major = models.CharField('專業',max_length=30)# 修改顯示的表的名字class Meta:verbose_name = '專業'verbose_name_plural = '專業'def __str__(self):return self.major# 課程表 class Course(models.Model):id = models.AutoField('序號',primary_key=True)course_id = models.CharField('課程號',max_length=10)course_name = models.CharField('課程名稱',max_length=30)class Meta:verbose_name = '課程'verbose_name_plural = '課程'def __str__(self):return self.course_name# 學生表 class Student(models.Model):sid = models.CharField('學號',max_length=12,primary_key=True)name = models.CharField('姓名',max_length=20,unique=True)sex = models.BooleanField('性別',choices=((0,'女'),(1,'男')))age = models.IntegerField('年齡')academy = models.ForeignKey(Academy,on_delete=models.CASCADE,verbose_name='學院')major = models.ForeignKey(Major,on_delete=models.CASCADE,verbose_name='專業')sclass = models.CharField('班級',max_length=20,help_text='例如: 17-03')email = models.EmailField('郵箱',default=None) # 默認為空 唯一值pwd = models.CharField('密碼',max_length=20)# 修改顯示的表的名字class Meta:verbose_name = '學生'verbose_name_plural = '學生信息表'def __str__(self):return self.sid# 題庫表 class QuestionBank(models.Model):id = models.AutoField('序號',primary_key=True)major = models.ForeignKey(Major,on_delete=models.CASCADE,verbose_name='專業')course = models.ForeignKey(Course,on_delete=models.CASCADE,verbose_name='科目')title = models.TextField('題目')qtype = models.CharField('題目類型',choices=(('單選','單選'),('多選','多選'),('判斷','判斷')),max_length=40)a = models.CharField('A選項',max_length=40)b = models.CharField('B選項',max_length=40)c = models.CharField('C選項',max_length=40)d = models.CharField('D選項',max_length=40)answer = models.CharField('答案',choices=(('A','A'),('B','B'),('C','C'),('D','D')),max_length=4)difficulty = models.CharField('難度',choices=(('easy','簡單'),('middle','中等'),('difficult','難')),max_length=10)score = models.IntegerField('分值')class Meta:# 選擇這個表之后顯示的名字verbose_name = '題庫'# 顯示的表名verbose_name_plural = '題庫'def __str__(self):return '<%s:%s>' % (self.course, self.title)# 試卷表 class TestPaper(models.Model):id = models.AutoField('序號',primary_key=True)title = models.CharField('題目',max_length=40,unique=True)pid = models.ManyToManyField(QuestionBank)course = models.ForeignKey(Course,on_delete=models.CASCADE,verbose_name='科目')major = models.ForeignKey(Major,on_delete=models.CASCADE,verbose_name='考卷適合專業')time = models.IntegerField('考試時長',help_text='單位是分鐘')examtime = models.DateTimeField('上次考試時間')class Meta:# 選擇這個表之后顯示的名字verbose_name = '試卷'verbose_name_plural = '試卷'# # 學生成績表 class Record(models.Model):id = models.AutoField('序號',primary_key=True)sid = models.ForeignKey(Student,on_delete=models.CASCADE,verbose_name='學號',related_name='stu_xuehao')course = models.ForeignKey(Course,on_delete=models.CASCADE,verbose_name='考試科目',related_name='stu_course')grade = models.FloatField('成績')rtime = models.DateTimeField('考試時間',blank=True,null=True)class Meta:verbose_name = '學生成績'verbose_name_plural = '學生成績'def __str__(self):return '<%s:%s>' % (self.sid,self.grade)編寫好了Model后,接下來就需要進行數據遷移。遷移是Django對模型所做的更改傳遞到數據庫中的方式。
注意,每當對數據庫進行了更改(添加、修改、刪除等)操作,都需要進行數據遷移。
Django的遷移代碼是由模型文件自動生成的,它本質上只是個歷史記錄,Django可以用它來進行數據庫的滾動更新,通過這種方式使其能夠和當前的模型匹配。
在命令行中輸入命令讓 Django知道我們自定義模型有一些變更,并根據我們自定義app的模型生成創建數據表的腳本:
python manage.py makemigrations最后通過命令創建app模型對應的數據庫表:
python manage.py migrate定義視圖函數
Django 中視圖的概念是「一類具有相同功能和模板的網頁的集合」。
比如,在一個考試系統中,我們可能需要如下幾個視圖:
登錄:輸入用戶和密碼,根據校驗結果進行登錄處理。
考試:展示考試試題及選項,根據選擇的結果記錄考試成績。
這些需求都靠視圖(View)來完成。
每一個視圖表現為一個簡單的Python函數,它需要要做的只有兩件事:返回一個包含被請求頁面內容的 HttpResponse對象,或者拋出一個異常,比如 Http404 。
視圖函數中的request與網頁發來的請求有關,里面包含get或post的內容、用戶瀏覽器、系統等信息。
根據系統設計過程中需要的功能,我們在exam/views.py文件中創建如下幾個視圖函數:
studentLogin:
此視圖函數用戶登錄,調用此函數時系統將會檢驗輸入的表單的用戶名和密碼是否匹配,如果匹配則將用戶信息存入session,同時跳轉到首頁(考試信息)。
# 學生登錄 def studentLogin(request):if request.method == 'POST':# 獲取表單信息sid = request.POST.get('sid')password = request.POST.get('password')print("sid", sid, "password", password)# 通過學號獲取該學生實體student = models.Student.objects.get(sid=sid)print(student)if password == student.pwd: # 登錄成功request.session['username']=sid #user的值發送給session里的usernamerequest.session['is_login']=True #認證為真# 查詢考試信息paper = models.TestPaper.objects.filter(major=student.major)# 查詢成績信息grade = models.Record.objects.filter(sid=student.sid)# 渲染index模板return render(request, 'index.html', {'student': student, 'paper': paper, 'grade': grade})else:return render(request,'login.html',{'message':'密碼不正確'})elif request.method == 'GET':return render(request, 'login.html')else:return HttpResponse("請使用GET或POST請求數據")index:
根據登錄函數傳的參數,顯示該用戶可以參加的考試試卷,在該頁面可以點擊開始考試按鈕進行考試。
# 首頁 def index(request):if request.session.get('is_login',None): #若session認證為真username = request.session.get('username',None)print(username )student = models.Student.objects.get(sid=username)# 查詢考試信息paper = models.TestPaper.objects.filter(major=student.major)return render(request, 'index.html',{'student': student,'paper': paper})else:return render(request, 'index.html')userfile:
顯示當前用戶的個人信息
def userfile(request):if request.session.get('is_login',None): #若session認證為真username = request.session.get('username',None)print(username )student = models.Student.objects.get(sid=username)# 查詢考試信息paper = models.TestPaper.objects.filter(major=student.major)return render(request, 'userfile.html',{'student': student})stulogout:
退出登錄,清楚Session信息
#學生退出登錄 def stulogout(request):# logout(request)request.session.clear()url = reverse('exam:index')return redirect(url)startExam:
開始考試,跳轉到考試頁面
# 考試信息 def startExam(request):sid = request.GET.get('sid')title = request.GET.get('title') # 試卷名字 唯一subject1 = request.GET.get('subject') # 考試科目# 獲取學生信息student = models.Student.objects.get(sid=sid)# 試卷信息paper = models.TestPaper.objects.filter(title=title,course__course_name=subject1)context = {'student': student,'paper': paper,'title': title,'subject':subject1,'count': paper.count() # 數據表中數據的條數}return render(request, 'exam.html', context=context)examinfo:
顯示考試成績頁面
def examinfo(request):if request.session.get('is_login',None): #若session認證為真username = request.session.get('username',None)student = models.Student.objects.get(sid=username)# 查詢成績信息grade = models.Record.objects.filter(sid=student.sid)return render(request, 'examinfo.html',{'student': student,'grade': grade})else:return render(request, 'examinfo.html')calculateGrade:
交卷時自動計算考試成績,并存入數據庫
# 計算考試成績 def calculateGrade(request):if request.method == 'POST':sid = request.POST.get('sid')subject1 = request.POST.get('subject')student = models.Student.objects.get(sid=sid)paper = models.TestPaper.objects.filter(major=student.major)grade = models.Record.objects.filter(sid=student.sid)course = models.Course.objects.filter(course_name=subject1).first()now = datetime.now()# 計算考試成績questions = models.TestPaper.objects.filter(course__course_name=subject1).values('pid').values('pid__id','pid__answer','pid__score')stu_grade = 0 # 初始化一個成績for p in questions:qid = str(p['pid__id'])stu_ans = request.POST.get(qid)cor_ans = p['pid__answer']if stu_ans == cor_ans:stu_grade += p['pid__score']models.Record.objects.create(sid_id=sid, course_id=course.id, grade=stu_grade,rtime=now)context = {'student': student,'paper': paper,'grade': grade}return render(request, 'index.html', context=context)配置訪問路由URL
有了視圖后,我們需要將視圖函數和Web網頁鏈接對應起來。
url可以理解為訪問網站時輸入的網址鏈接,配置好url后Django才知道怎樣定位app。
打開DjangoExam/urls.py,輸入如下代碼:
from django.contrib import admin from django.urls import path, include from django.conf.urls import url from exam import viewsurlpatterns = [path('admin/', admin.site.urls),url(r'^$',views.index),#默認訪問首頁url('index/',views.index,name='index'),url('studentLogin/',views.studentLogin,name='studentLogin'),#學生登錄url('startExam/',views.startExam,name='startExam'),#開始考試url('calculateGrade/',views.calculateGrade,name='calculateGrade'),#考試評分path('stulogout/',views.stulogout,name='stulogout'), # 學生退出登錄path('userfile/',views.userfile,name='userfile'), # 個人信息path('examinfo/',views.examinfo,name='examinfo'), # 考試信息 ]通過配置如上URL,Django 將會根據用戶請求的 URL 來選擇使用哪個視圖。
靜態資源準備及配置
本系統前后端不分離,前端框架選用當前比較受歡迎的Bootstrap4,為了快速開發,本系統所有的頁面都使用原生Bootstrap進行開發,未采用第三方的模板和主題。
下載 Bootstrap · Bootstrap v4 中文文檔 v4.6 | Bootstrap 中文網下載 Bootstrap 以獲得編譯后的 CSS 和 JavaScript 文件、源碼,或者通過你所喜歡的軟件包管理器,例如 npm、RubyGems 等,將 Bootstrap 添加到你的項目中。[這里是圖片008]https://v4.bootcss.com/docs/getting-started/download/
因為bootstrap.js依賴 jquery.js和popper.js才能正常運行,因此我們也需要一并下載保存。
由于popper.js版本兼容問題,本系統采用cdn 遠程引入的形式。
附上官網下載鏈接(進入下載頁面,復制粘貼代碼到新文件即可):
Download jQuery | jQuery[這里是圖片009]https://jquery.com/download/
在項目根目錄下新建一個文件夾static用于存放前端模板靜態資源。
把剛才Bootstrap解壓出來的css和js兩個文件夾復制到static文件夾去。
把剛剛解壓出來的jQuery文件夾復制到static文件夾去。
完成后Static文件夾結構如下圖:
準備好靜態資源后,我們還需要在Django中指定靜態文件的存放位置,這樣才能夠在模板中正確引用它們。
在DjangoExam/settings.py 中進行如下配置:
STATIC_URL = '/static/'STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), # 添加此項 ]模板創建
在創建模板之前,我們先在根目錄下新建一個文件夾templates用于存放我們的所有的模板文件。
模板位置也同樣需要進行配置指定模板的存放位置,在DjangoExam/settings.py 中進行如下配置:
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')], # 添加此項'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},}, ]接著我們在模板文件中新建三個文件:
- base.html:是整個項目的模板基礎,所有的網頁都從它繼承;
- header.html:是網頁頂部的導航欄;
- footer.html:是網頁底部的注腳。
分別編寫三個靜態HTML文件代碼如下:
templates/base.html:
<!-- 載入靜態文件--> {% load static %} <!-- 網站主語言 --> <html lang="zh-cn"> <head><!-- 網站采用的字符編碼 --><meta charset="utf-8"><!-- 預留網站標題的位置 --><title>{% block title %}{% endblock %}</title><!-- 引入bootstrap的css文件 --><link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css"> </head> <body> <!-- 引入導航欄 --> {% include 'header.html' %} <!-- 預留具體頁面的位置 --> {% block content %}{% endblock content %} <!-- 引入注腳 --> {% include 'footer.html' %} <!-- bootstrap.js 依賴 jquery.js 和popper.js,因此在這里引入 --> <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script> <script src="{% static 'jquery/jquery-3.6.0.js' %}"></script> <!--popper.js 采用 cdn 遠程引入,意思是你不需要把它下載到本地。在實際的開發中推薦靜態文件盡量都使用 cdn 的形式。教程采用本地引入是為了讓讀者了解靜態文件本地部署的流程。 --> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1-lts/dist/umd/popper.min.js"></script><!-- 引入bootstrap的js文件 --> <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script> </body></html>templates/header.html:
<!-- 定義導航欄 --> <nav class="navbar navbar-expand-lg navbar-dark bg-primary"><div class="container"><!-- 導航欄商標 --><a class="navbar-brand" href="#">在線考試</a><!-- 導航入口 --><div><ul class="navbar-nav"><li class="nav-item"><a class="nav-link" href="/index/">首頁</a></li><li class="nav-item"><a class="nav-link" href="/examinfo/">考試記錄</a></li><!-- Django的 if 模板語句 -->{% if request.session.username %}<!-- 如果用戶已經登錄,則顯示用戶名下拉框 --><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ request.session.username }}</a><div class="dropdown-menu" aria-labelledby="navbarDropdown"><a class="dropdown-item" href="/userfile/">個人信息</a><a class="dropdown-item" href="/stulogout/">退出登錄</a></div></li><!-- 如果用戶未登錄,則顯示 “登錄” -->{% else %}<li class="nav-item"><a class="nav-link" href="/studentLogin/">登錄</a></li><!-- if 語句在這里結束 -->{% endif %}<li class="nav-item"><a class="nav-link" href="/admin">管理員</a></li></ul></div></div> </nav>templates/footer.html:
{% load static %} <!-- Footer --> <div><br><br><br> </div> <footer class="py-3 bg-dark fixed-bottom"><div class="container"><p class="m-0 text-center text-white">Copyright © DjangoExam 2021</p></div> </footer>上述三個文件是網站頁面的通用組件模塊,基本上每個頁面都不會變,所以我們把他們獨立出來。
我們編寫Django后續的頁面模板時可以直接繼承對應的通用模板組件。
接下來我們在三個通用組件的基礎上分別編寫各個視圖對應的模板頁面:
限于篇幅,放一些關鍵代碼供參考:
index.html
<!-- extends表明此頁面繼承自 base.html 文件 --> {% extends "base.html" %} {% load static %} <!-- 寫入 base.html 中定義的 title --> {% block title %} 在線考試系統 {% endblock title %} <!-- 寫入 base.html 中定義的 content --> {% block content %} <div class="container"><div class="container"><br><h3>考試信息</h3><div class="container"><div class="row mt-4">{% for paper1 in paper %}<!-- 文章內容 --><div class="col-6 mb-6"><!-- 卡片容器 --><div class="card"><!-- 標題 --><h4 class="card-header">{{ paper1.title }}</h4><!-- 摘要 --><div class="card-body"><h4 class="card-title">{{ paper1.course }}</h4><p class="card-text">{{ paper1.examtime }}</p><a href="/startExam/?sid={{ student.sid }}&title={{ paper1.title }}&subject={{ paper1.course }}" class="card-link">開始考試</a></div></div></div>{% endfor %}</div></div><p></p></div> </div> {% endblock content %}login.html
{% extends "base.html" %} {% load static %} {% block title %} 登錄 {% endblock title %} {% block content %} <div class="container"><div class="row justify-content-md-center"><div class="col-4"><br><form method="post" action="/studentLogin/"> <!-- {% csrf_token %}--><!-- 賬號 --><div class="form-group"><label >學生學號</label><input type="text" class="form-control" name="sid" placeholder="輸入學號"></div><!-- 密碼 --><div class="form-group"><label for="password">密碼</label><input type="password" class="form-control" id="password" name="password" placeholder="輸入密碼"></div><!-- 提交按鈕 --><button type="submit" class="btn btn-primary">登錄</button><div class="form-group"><br><br></div></form></div></div> </div> {% endblock content %}exam.html
<div class="container">{% for paper1 in paper %}{% for test in paper1.pid.all %}<div class="row bg-light"><div class="col-12"> <!-- <div class="card">--> <!-- <div class="card-body h-10">--><div id="{{ forloop.counter }}"><b>{{ forloop.counter}}.</b><span>({{ test.score }}分)</span><b>{{ test.title }}</b><ul><li class="option"><input type="radio" class="radioOrCheck" name="{{ test.id }}"value="A"/><label>A.<p class="ue" style="display: inline;">{{ test.a }}</p></label></li><li class="option"><input type="radio" class="radioOrCheck" name="{{ test.id }}"value="B"/><label>B.<p class="ue" style="display: inline;">{{ test.b }}</p></label></li><li class="option"><input type="radio" class="radioOrCheck" name="{{ test.id }}"value="C"/><label>C.<p class="ue" style="display: inline;">{{ test.c}}</p></label></li><li class="option"><input type="radio" class="radioOrCheck" name="{{ test.id }}"value="D"/><label>D.<p class="ue" style="display: inline;">{{ test.d }}</p></label></li></ul> <!-- </div>--> <!-- </div>--></div></div></div>{% endfor %}{% endfor %}</div>examinfo.html
<div class="container"><div class="container"><br><h3>考試成績</h3><p></p><table class="table"><thead><tr><th>姓名</th><th>科目</th><th>成績</th><th>考試時間</th></tr></thead><tbody>{% for grade1 in grade %}<tr class="table"><td>{{ student.name }}</td><td>{{ grade1.course }}</td><td>{{ grade1.grade }}</td><td>{{ grade1.rtime|date:"Y-m-d H:i:s"}}</td></tr>{% endfor %}</tbody></table></div> </div>userfile.html
<div class="container"><br><div class="row justify-content-md-center"><div class="col-8"><div class="panel panel-info"><div class="panel-heading"><h3 class="panel-title">個人信息</h3></div><div class="panel-body"><table class="table table-borderless"><tbody><tr><td>學號</td><td>{{ student.sid }}</td></tr><tr class="table"><td>姓名</td><td>{{ student.name }}</td></tr><tr class="table"><td>性別</td>{% if student.sex%}<td>男</td>{% else %}<td>女</td>{% endif %}</tr><tr class="table"><td>學院</td><td>{{ student.academy }}</td></tr><tr class="table"><td>專業</td><td>{{ student.major }}</td></tr><tr class="table"><td>郵箱地址</td><td>{{ student.email }}</td></tr><tr class="table"><td>出生日期</td><td>{{ student.birth }}</td></tr></tbody></table></div></div></div></div> </div>Django后臺啟用配置
Django自帶后臺功能,我們只需要兩步就可以使用后臺功能直接更新我們的后臺數據表信息。
1、創建超級用戶
在命令行輸入:python manage.py createsuperuser
根據提示信息輸入用戶名,郵箱和密碼后系統就創建了一個超級用戶。
2、注冊模型到admin中
打開exam/admin.py輸入如下代碼將所有的模型都注冊到admin中,我們就可以在Django自帶的后臺中更新我們的數據表了。
from django.contrib import admin# Register your models here.# 修改名稱 admin.site.site_header='在線考試系統后臺' admin.site.site_title='在線考試系統'from exam.models import Academy,Major, Course,Student,QuestionBank,TestPaper,Recordadmin.site.register([Academy,Major,Course,Student,QuestionBank,TestPaper,Record])運行服務器測試效果
在Windows命令行輸入:
python manage.py runserver運行服務器后在瀏覽器中輸入我們之前配置的首頁對應的URL地址:
http://127.0.0.1:8000/index
結語:
本系統僅僅實現了考試管理系統的部分功能,還有很多的功能可以添加到此系統中。
比如:
可以引入教師管理模塊,針對教師和學生端實現不同的功能需求。
針對成績部分,可以引入圖表,進行可視化的數據分析等等。
最后,原創不易,希望大家能夠點贊支持下。
總結
以上是生活随笔為你收集整理的[Python + Django] Web在线考试管理系统设计及代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “我只想选个座,你却要我社交?”航旅纵横
- 下一篇: 消息队列MQ快速入门