文末附源碼鏈接系統(tǒng)功能需求分析在線考試管理系統(tǒng)," />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > [Python+Django] Web在線考試管理系統(tǒng)設(shè)計及代碼實現(xiàn)

[Python+Django] Web在線考試管理系統(tǒng)設(shè)計及代碼實現(xiàn)

時間:2023-10-02 03:00:02 | 來源:網(wǎng)站運營

時間:2023-10-02 03:00:02 來源:網(wǎng)站運營

[Python+Django] Web在線考試管理系統(tǒng)設(shè)計及代碼實現(xiàn): 本文最終實現(xiàn)一個Web在線考試管理系統(tǒng),可作為Python Web,Django的練手項目,也可以作為計算機畢業(yè)設(shè)計參考項目。

文末附源碼鏈接

系統(tǒng)功能需求分析

在線考試管理系統(tǒng),主要包含如下幾個功能模塊:

1、用戶登錄及:實現(xiàn)簡單的登錄及驗證

2、個人信息展示:展示考生個人信息

3、考試管理:展示可以考試的試卷,考試及自動計算考試成績。

4、考試成績管理:展示考試結(jié)果

5、后臺基礎(chǔ)數(shù)據(jù)管理:試卷,試題,考生等信息更新維護。

系統(tǒng)設(shè)計及實現(xiàn)思路

系統(tǒng)設(shè)計包括三部分:數(shù)據(jù)庫設(shè)計,功能函數(shù)視圖設(shè)計,前端頁面設(shè)計

1、數(shù)據(jù)庫設(shè)計

根據(jù)我們的的系統(tǒng)需求分析,我們預(yù)計需要如下幾個數(shù)據(jù)表:

2、頁面及功能設(shè)計

為了實現(xiàn)我們前面的功能模塊我們設(shè)計如下幾個功能頁面:

1、登錄頁面:

其中需要登錄,校驗,登錄后同時需要存儲用戶信息在Session中,以備登錄后的頁面使用。

2、首頁(考試信息頁):

頁面需要顯示當前用戶可以參考的考試試卷信息,在此頁面點擊開始考試可以跳轉(zhuǎn)到考試頁面。

3、考試頁面:

展示對應(yīng)試卷的題目和選項信息,同時可以進行答題,交卷后可以自動計算考試分數(shù)并存入數(shù)據(jù)庫。

4、成績顯示頁面:

展示對應(yīng)考試的考試結(jié)果

5、后臺管理:

用于管理我們的專業(yè),考生,試卷,題庫等基礎(chǔ)信息,為了快速實現(xiàn)系統(tǒng)我們將直接啟用Django自帶的Admin管理功能。

6、個人詳情:

用于展示個人詳情信息。

系統(tǒng)實現(xiàn)過程及源碼

大致理清了我們需要實現(xiàn)的功能模塊之后,我們開始擼代碼

1 開發(fā)環(huán)境搭建及技術(shù)選型

服務(wù)端:Python 3.8

Web框架:Django 3.2

數(shù)據(jù)庫:MySQL mysql-8.0.13-winx64

開發(fā)工具IDE:Pycharm(社區(qū)版)

前端框架:Bootstrap 4

詳細環(huán)境搭建工具安裝請參考下文:

2、Django項目創(chuàng)建及數(shù)據(jù)庫連接配置

1.在任意盤符文件夾下新建一個空白Pycharm項目文件夾比如:PycharmProjects

2.打開Pycharm,進入空白文件夾:PycharmProjects

3.通過Pycharm 的Windows 命令行輸入界面輸入創(chuàng)建Django項目的命令,創(chuàng)建一個新的項目: DjangoExam

django-admin startproject DjangoExam


3、 數(shù)據(jù)庫創(chuàng)建和連接配置

Django 對各種數(shù)據(jù)庫提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 為這些數(shù)據(jù)庫提供了統(tǒng)一的調(diào)用API。

我們可以根據(jù)自己業(yè)務(wù)需求選擇不同的數(shù)據(jù)庫。

MySQL 是 Web 應(yīng)用中最常用的數(shù)據(jù)庫。

本文采用MySQL。

此步驟將數(shù)據(jù)庫設(shè)置連接到自己的MySQL數(shù)據(jù)庫,并完成數(shù)據(jù)庫的創(chuàng)建.

數(shù)據(jù)庫創(chuàng)建

Django只能操作到數(shù)據(jù)表級別,不能操作到數(shù)據(jù)庫級別,所以需要手工創(chuàng)建一個數(shù)據(jù)庫:djangoexam

我們可以通過命令行創(chuàng)建一個數(shù)據(jù)庫:

1.進入mysql安裝文件夾的bin 子文件夾目錄:

比如:D:/Program Files/mysql-8.0.13-winx64/bin

2.連接數(shù)據(jù)庫:

mysql -u root -p Enter password:******

3.連接登錄成功后通過命令創(chuàng)建一個數(shù)據(jù)庫:djangoexam

CREATE DATABASE IF NOT EXISTS djangoexam DEFAULT CHARSET utf8;

或者通過SQLlog工具創(chuàng)建一個數(shù)據(jù)庫: djangoexam

Django數(shù)據(jù)庫連接配置

Django使用MySQL需要mysql 驅(qū)動,如果你沒安裝 mysql 驅(qū)動,可以執(zhí)行以下命令安裝:

pip install pymysql安裝好之后, 進入DjangoExam 項目下的DjangoExam 文件夾,打開setting.py 文件,找到DATABASES配置項,修改DATABSES配置項為如下內(nèi)容:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 數(shù)據(jù)庫引擎 'NAME': 'djangoexam', # 數(shù)據(jù)庫名稱 'HOST': '127.0.0.1', # 數(shù)據(jù)庫地址,本機 ip 地址 127.0.0.1 'PORT': 3306, # 端口 'USER': 'root', # 數(shù)據(jù)庫用戶名 'PASSWORD': '123456', # 數(shù)據(jù)庫密碼 }}


然后使用 pymysql 模塊連接 mysql 數(shù)據(jù)庫:

在與 settings.py 同級目錄下的 __init__.py 中引入模塊和進行配置:

import pymysql pymysql.install_as_MySQLdb()


至此,我們創(chuàng)建了一個Django項目DjangoExam用于我們后續(xù)的在線考試管理系統(tǒng)開發(fā)的程序編寫。

同時為此項目創(chuàng)建了一個MySQL數(shù)據(jù)庫:djangoexam用于我們程序開發(fā)過程中的數(shù)據(jù)存放和處理。

4、功能模塊詳細開發(fā)

一個Django項目框架搭建起來后,我們所有對系統(tǒng)的前后臺所有的程序開發(fā)都可以在這個項目中進行了,一個典型的Django項目模塊功能的開發(fā)包括如下幾個步驟:

創(chuàng)建APP

在Django中的一個app代表一個功能模塊,Django 規(guī)定,如果要使用模型,必須要創(chuàng)建一個 app。

本來一般實際開發(fā)中方便管理一個功能模塊需要單獨新建一個app,我們?yōu)榱丝焖匍_發(fā),所有的功能和模型都在一個app中進行管理。

在命令行中輸入python manage.py startapp exam指令,創(chuàng)建名為exam的app:

python manage.py startapp exam注冊APP

在 DjangoExam文件夾目錄下的settings.py 中找到INSTALLED_APPS配置項,將新創(chuàng)建的exam添加到項目的app列表,如下:

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'exam', #添加此項]定義模型

我們之前創(chuàng)建了一個空白的數(shù)據(jù)庫djangoexam,這一步我們通過Django的模型來完成數(shù)據(jù)庫表的創(chuàng)建.

因為Django對模型和目標數(shù)據(jù)庫之間有自身的映射規(guī)則,如果自己在數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表,可能不一定符合Django的建表規(guī)則,從而導(dǎo)致模型和目標數(shù)據(jù)庫無法建立通信聯(lián)系。

所以最好我們在Django項目中還是通過Django模型來創(chuàng)建對應(yīng)數(shù)據(jù)庫表

一個表對應(yīng)一個模型,本步驟按照我們前面數(shù)據(jù)庫設(shè)計需要設(shè)計7個模型:

?打開exam/models.py文件,輸入如下代碼:

from django.db import models # 學(xué)院表class Academy(models.Model): id = models.AutoField('序號',primary_key=True) name = models.CharField('學(xué)院',max_length=20) # 修改顯示的表的名字 class Meta: verbose_name = '學(xué)院' verbose_name_plural = '學(xué)院' def __str__(self): return self.name # 專業(yè)表class Major(models.Model): id = models.AutoField('序號',primary_key=True) academy = models.ForeignKey(Academy,on_delete=models.CASCADE,verbose_name='學(xué)院') major = models.CharField('專業(yè)',max_length=30) # 修改顯示的表的名字 class Meta: verbose_name = '專業(yè)' verbose_name_plural = '專業(yè)' 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 # 學(xué)生表class Student(models.Model): sid = models.CharField('學(xué)號',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='學(xué)院') major = models.ForeignKey(Major,on_delete=models.CASCADE,verbose_name='專業(yè)') 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 = '學(xué)生' verbose_name_plural = '學(xué)生信息表' 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='專業(yè)') 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='考卷適合專業(yè)') time = models.IntegerField('考試時長',help_text='單位是分鐘') examtime = models.DateTimeField('上次考試時間') class Meta: # 選擇這個表之后顯示的名字 verbose_name = '試卷' verbose_name_plural = '試卷' # # 學(xué)生成績表class Record(models.Model): id = models.AutoField('序號',primary_key=True) sid = models.ForeignKey(Student,on_delete=models.CASCADE,verbose_name='學(xué)號',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 = '學(xué)生成績' verbose_name_plural = '學(xué)生成績' def __str__(self): return '<%s:%s>' % (self.sid,self.grade)


編寫好了Model后,接下來就需要進行數(shù)據(jù)遷移。遷移是Django對模型所做的更改傳遞到數(shù)據(jù)庫中的方式。

注意,每當對數(shù)據(jù)庫進行了更改(添加、修改、刪除等)操作,都需要進行數(shù)據(jù)遷移。

Django的遷移代碼是由模型文件自動生成的,它本質(zhì)上只是個歷史記錄,Django可以用它來進行數(shù)據(jù)庫的滾動更新,通過這種方式使其能夠和當前的模型匹配。

在命令行中輸入命令讓 Django知道我們自定義模型有一些變更,并根據(jù)我們自定義app的模型生成創(chuàng)建數(shù)據(jù)表的腳本:

python manage.py makemigrations最后通過命令創(chuàng)建app模型對應(yīng)的數(shù)據(jù)庫表:

python manage.py migrate定義視圖函數(shù)

Django 中視圖的概念是「一類具有相同功能和模板的網(wǎng)頁的集合」。

比如,在一個考試系統(tǒng)中,我們可能需要如下幾個視圖:

登錄:輸入用戶和密碼,根據(jù)校驗結(jié)果進行登錄處理。
考試:展示考試試題及選項,根據(jù)選擇的結(jié)果記錄考試成績。
這些需求都靠視圖(View)來完成。

每一個視圖表現(xiàn)為一個簡單的Python函數(shù),它需要要做的只有兩件事:返回一個包含被請求頁面內(nèi)容的 HttpResponse對象,或者拋出一個異常,比如 Http404 。

視圖函數(shù)中的request與網(wǎng)頁發(fā)來的請求有關(guān),里面包含get或post的內(nèi)容、用戶瀏覽器、系統(tǒng)等信息。

根據(jù)系統(tǒng)設(shè)計過程中需要的功能,我們在exam/views.py文件中創(chuàng)建如下幾個視圖函數(shù):

?studentLogin:

此視圖函數(shù)用戶登錄,調(diào)用此函數(shù)時系統(tǒng)將會檢驗輸入的表單的用戶名和密碼是否匹配,如果匹配則將用戶信息存入session,同時跳轉(zhuǎn)到首頁(考試信息)。

# 學(xué)生登錄def studentLogin(request): if request.method == 'POST': # 獲取表單信息 sid = request.POST.get('sid') password = request.POST.get('password') print("sid", sid, "password", password) # 通過學(xué)號獲取該學(xué)生實體 student = models.Student.objects.get(sid=sid) print(student) if password == student.pwd: # 登錄成功 request.session['username']=sid #user的值發(fā)送給session里的username request.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請求數(shù)據(jù)")index:

根據(jù)登錄函數(shù)傳的參數(shù),顯示該用戶可以參加的考試試卷,在該頁面可以點擊開始考試按鈕進行考試。

# 首頁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信息

#學(xué)生退出登錄

def stulogout(request): # logout(request) request.session.clear() url = reverse('exam:index') return redirect(url)


startExam:

開始考試,跳轉(zhuǎn)到考試頁面

# 考試信息def startExam(request): sid = request.GET.get('sid') title = request.GET.get('title') # 試卷名字 唯一 subject1 = request.GET.get('subject') # 考試科目 # 獲取學(xué)生信息 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() # 數(shù)據(jù)表中數(shù)據(jù)的條數(shù) } 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:

交卷時自動計算考試成績,并存入數(shù)據(jù)庫

# 計算考試成績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

有了視圖后,我們需要將視圖函數(shù)和Web網(wǎng)頁鏈接對應(yīng)起來。

url可以理解為訪問網(wǎng)站時輸入的網(wǎng)址鏈接,配置好url后Django才知道怎樣定位app。

打開DjangoExam/urls.py,輸入如下代碼:

from django.contrib import adminfrom django.urls import path, includefrom django.conf.urls import urlfrom exam import views urlpatterns = [ path('admin/', admin.site.urls), url(r'^$',views.index),#默認訪問首頁 url('index/',views.index,name='index'), url('studentLogin/',views.studentLogin,name='studentLogin'),#學(xué)生登錄 url('startExam/',views.startExam,name='startExam'),#開始考試 url('calculateGrade/',views.calculateGrade,name='calculateGrade'),#考試評分 path('stulogout/',views.stulogout,name='stulogout'), # 學(xué)生退出登錄 path('userfile/',views.userfile,name='userfile'), # 個人信息 path('examinfo/',views.examinfo,name='examinfo'), # 考試信息]通過配置如上URL,Django 將會根據(jù)用戶請求的 URL 來選擇使用哪個視圖。

靜態(tài)資源準備及配置

本系統(tǒng)前后端不分離,前端框架選用當前比較受歡迎的Bootstrap4,為了快速開發(fā),本系統(tǒng)所有的頁面都使用原生Bootstrap進行開發(fā),未采用第三方的模板和主題。

因為bootstrap.js依賴 jquery.js和popper.js 才能正常運行,因此我們也需要一并下載保存。

由于 popper.js 版本兼容問題,本系統(tǒng)采用 cdn 遠程引入的形式。
附上官網(wǎng)下載鏈接(進入下載頁面,復(fù)制粘貼代碼到新文件即可):

在項目根目錄下新建一個文件夾static用于存放前端模板靜態(tài)資源。

把剛才Bootstrap解壓出來的css和js兩個文件夾復(fù)制到static文件夾去。

把剛剛解壓出來的jQuery文件夾復(fù)制到static文件夾去。

完成后Static文件夾結(jié)構(gòu)如下圖:

?準備好靜態(tài)資源后,我們還需要在Django中指定靜態(tài)文件的存放位置,這樣才能夠在模板中正確引用它們。

在DjangoExam/settings.py 中進行如下配置:

STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), # 添加此項]模板創(chuàng)建

在創(chuàng)建模板之前,我們先在根目錄下新建一個文件夾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:是整個項目的模板基礎(chǔ),所有的網(wǎng)頁都從它繼承;

· header.html:是網(wǎng)頁頂部的導(dǎo)航欄;

· footer.html:是網(wǎng)頁底部的注腳。

分別編寫三個靜態(tài)HTML文件代碼如下:

templates/base.html:

<!-- 載入靜態(tài)文件-->{% load static %}<!-- 網(wǎng)站主語言 --><html lang="zh-cn"><head> <!-- 網(wǎng)站采用的字符編碼 --> <meta charset="utf-8"> <!-- 預(yù)留網(wǎng)站標題的位置 --> <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><!-- 引入導(dǎo)航欄 -->{% include 'header.html' %}<!-- 預(yù)留具體頁面的位置 -->{% 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 遠程引入,意思是你不需要把它下載到本地。 在實際的開發(fā)中推薦靜態(tài)文件盡量都使用 cdn 的形式。 教程采用本地引入是為了讓讀者了解靜態(tài)文件本地部署的流程。--><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:

<!-- 定義導(dǎo)航欄 --><nav class="navbar navbar-expand-lg navbar-dark bg-primary"> <div class="container"> <!-- 導(dǎo)航欄商標 --> <a class="navbar-brand" href="#">在線考試</a> <!-- 導(dǎo)航入口 --> <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 %} <!-- 如果用戶已經(jīng)登錄,則顯示用戶名下拉框 --> <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 語句在這里結(jié)束 --> {% 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 &copy; DjangoExam 2021</p> </div></footer>上述三個文件是網(wǎng)站頁面的通用組件模塊,基本上每個頁面都不會變,所以我們把他們獨立出來。

我們編寫Django后續(xù)的頁面模板時可以直接繼承對應(yīng)的通用模板組件。

接下來我們在三個通用組件的基礎(chǔ)上分別編寫各個視圖對應(yīng)的模板頁面:

限于篇幅,放一些關(guān)鍵代碼供參考:

index.html

<!-- extends表明此頁面繼承自 base.html 文件 -->{% extends "base.html" %}{% load static %}<!-- 寫入 base.html 中定義的 title -->{% block title %}在線考試系統(tǒng){% 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 %} <!-- 文章內(nèi)容 --> <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 >學(xué)生學(xué)號</label> <input type="text" class="form-control" name="sid" placeholder="輸入學(xué)號"> </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>學(xué)號</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>學(xué)院</td> <td>{{ student.academy }}</td> </tr> <tr class="table"> <td>專業(yè)</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自帶后臺功能,我們只需要兩步就可以使用后臺功能直接更新我們的后臺數(shù)據(jù)表信息。

1、創(chuàng)建超級用戶

在命令行輸入:python manage.py createsuperuser

根據(jù)提示信息輸入用戶名,郵箱和密碼后系統(tǒng)就創(chuàng)建了一個超級用戶。

2、注冊模型到admin中

打開exam/admin.py輸入如下代碼將所有的模型都注冊到admin中,我們就可以在Django自帶的后臺中更新我們的數(shù)據(jù)表了。

from django.contrib import adminfrom exam.models import Academy,Major, Course,Student,QuestionBank,TestPaper,Record# Register your models here. # 修改名稱admin.site.site_header='在線考試系統(tǒng)后臺'admin.site.site_title='在線考試系統(tǒng)' admin.site.register([Academy,Major,Course,Student,QuestionBank,TestPaper,Record])運行服務(wù)器測試效果

在Windows命令行輸入:

python manage.py runserver

運行服務(wù)器后在瀏覽器中輸入我們之前配置的首頁對應(yīng)的URL地址:

http://127.0.0.1:8000/index


結(jié)語:

本系統(tǒng)僅僅實現(xiàn)了考試管理系統(tǒng)的部分功能,還有很多的功能可以添加到此系統(tǒng)中。

比如:

可以引入教師管理模塊,針對教師和學(xué)生端實現(xiàn)不同的功能需求。

針對成績部分,可以引入圖表,進行可視化的數(shù)據(jù)分析等等。





最后,原創(chuàng)不易,希望大家能夠點贊支持下。

源碼鏈接供參考:



關(guān)鍵詞:設(shè)計,實現(xiàn),系統(tǒng),管理,考試

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉