Django實現考試系統優化3

本次優化將針對考題部分,實現計算考試所用時間,並實現沒有填寫地址不能進行測試的功能。

models.py

from django.db import models
from datetime import datetime
# Create your models here.
from django.db import models
from users.models import UserProfile
# Create your models here.
from DjangoUeditor.models import UEditorField
#科目
class Subject(models.Model):
	name 			= models.CharField(max_length=255,verbose_name="科目名稱")
	description 	= models.TextField(verbose_name="科目描述")
	cover_image 	= models.ImageField(upload_to = 'cover/',blank=True)
	class Meta:
		verbose_name="科目"
		verbose_name_plural=verbose_name
	def __str__(self):
		return self.name
#題目
class Question(models.Model):
	choice = (('A','A'),('B','B'),('C','C'),('D','D'))
	subject 	= models.ForeignKey(Subject,on_delete=models.CASCADE,verbose_name="考試科目")
	statments 	= models.TextField(verbose_name="問題描述")
	op_A 	= models.CharField(max_length=1000,verbose_name="A選項")
	op_B 	= models.CharField(max_length=1000,verbose_name="B選項")
	op_C 	= models.CharField(max_length=1000,verbose_name="C選項")
	op_D 	= models.CharField(max_length=1000,verbose_name="D選項")
	correct_op 	= models.CharField(choices=choice,max_length=10,verbose_name="正確選項")
	mark 		= models.IntegerField(default=1,verbose_name="本題分數")
	class Meta:
		verbose_name="題目"
		verbose_name_plural=verbose_name
	def __str__(self):
		return self.statments


class Exam(models.Model):
	user = models.ForeignKey(UserProfile,on_delete=models.CASCADE,verbose_name="用戶")
	subject = models.ForeignKey(Subject,on_delete=models.CASCADE,verbose_name="考試科目")
	name = models.CharField(max_length=100,blank=True,verbose_name="本次考試名稱")
	class Meta:
		verbose_name="考試"
		verbose_name_plural=verbose_name
	def __str__(self):
		return self.name

class Mark(models.Model):
	user = models.ForeignKey(UserProfile,on_delete=models.CASCADE,verbose_name="用戶")
	subject = models.ForeignKey(Subject,on_delete=models.CASCADE,verbose_name="考試科目")
	exam = models.ForeignKey(Exam,on_delete=models.CASCADE,verbose_name="考試名稱")
	total_mark = models.IntegerField(verbose_name="總分數")
	base_mark = models.IntegerField(verbose_name="基礎分數")
	promote_mark = models.IntegerField(verbose_name="提升分數")
	major_mark = models.IntegerField(verbose_name="專業分數")
	jinglishijian=models.CharField(verbose_name="經歷時間",max_length=200)
	class Meta:
		verbose_name="分數"
		verbose_name_plural=verbose_name
	def __str__(self):
		return str(self.total_mark)

class Keshi(models.Model):
    keshi = models.CharField(max_length=10, verbose_name="分數可視化")
    class Meta:
        verbose_name = "分數可視化"
        verbose_name_plural = verbose_name

views.py


from django.shortcuts import render
from django.views.generic import View
from django.http import HttpResponse
from .models import Question,Exam,Subject,Mark
from django.db.models import Count
from django.contrib.auth.decorators import login_required
from users.models import UserProfile
import time

from django.utils.decorators import method_decorator
@method_decorator(login_required,name='dispatch')
class ExamView(View):
    def get(self,request):
        uid = request.user
        #查看是否已經進行過該考試,如果進行過該次考試,則不能再次考試,顯示成績
        if uid.is_exam==True:
            mark = Mark.objects.get(user=uid)
            return render(request, "score1.html", context={"mark": mark})
        else:
            #設置開始時間
            print(uid.province)
            if uid.province=='' or uid.city=='':
                alert="您還未填寫省市信息,還不能進行測試,請填寫相關信息後開始測試"
                return render(request,"usercenter-info.html",context={"alert1":alert})
            else:
                c=request.session['starttime'] = time.time()
                print(c)
                #獲取id=1的科目
                subjetcs1=Subject.objects.get(id=1)
                #打印這個科目的名稱,可省去
                print(subjetcs1)
                #獲取到這個科目下的所有試題
                question=Question.objects.filter(subject=subjetcs1)
                context={
                    "question":question,
                }
                return render(request, "exam005.html",context=context)
    def post(self,request):
        #設置結束時間
        a=request.session.get('starttime')
        print(a)
        dtime = rtdtime(request.session.get('starttime'), time.time())
        #考試獲取經歷時間
        lijingtime=rttime(dtime)
        print("考試經歷時間爲:",lijingtime)
        #獲取是哪個用戶
        uid = request.user
        print(uid.is_exam)
        #獲取當前用戶的暱稱
        uname=request.user.nick_name
        #獲取當前考試的學科
        subjetcs1 = Subject.objects.get(id=1)
        #獲取是哪次考試
        current_exam=Exam.objects.get(id=1)
        print("本次考試的科目爲:",subjetcs1)
        print("本次考試名稱爲:", current_exam)
        print(uid)
        print(uname)
        #獲取用戶的答案
        my_answer = []
        #這裏獲取總的題目數量,添加題目數量後無需繼續修改這裏的數據
        count_question = Question.objects.aggregate(count=Count("id"))
        for c in count_question.values():
            print(c)
        count1=c
        print(count1)
        for i in range(1,count1+1):
            answer1 = request.POST.get('%s'%i)
            my_answer.append(answer1)
            i+=1
        print("用戶答案爲:",my_answer)
        # 打印所有題目的正確答案
        correct_answer=re(request)
        timu_fenshu=fenshu(request)
        print("題目分數爲:", timu_fenshu)
        print("正確答案爲:",correct_answer)
        #基礎,提升,專業分數,總分數均初始化爲0
        base_mark=0
        promote_mark=0
        major_mark=0
        total_mark=0
        i=0
        while i <=count1-1 :
            if i <= 0:
                if correct_answer[i] == my_answer[i]:
                    base_mark += timu_fenshu[i]
                    total_mark = total_mark + timu_fenshu[i]
            elif i <= 1:
                if correct_answer[i] == my_answer[i]:
                    total_mark = total_mark+timu_fenshu[i]
                    promote_mark += timu_fenshu[i]
            else:
                if correct_answer[i] == my_answer[i]:
                    total_mark = total_mark+timu_fenshu[i]
                    print(timu_fenshu[i])
                    major_mark += timu_fenshu[i]
            i = i + 1
        print("總分數爲:", total_mark)
        print("基礎分數爲:", base_mark)
        print("提升分數爲:", promote_mark)
        print("專業分數爲:", major_mark)
        mark=Mark(user=uid,subject=subjetcs1,total_mark=total_mark,exam=current_exam,base_mark=base_mark,promote_mark=promote_mark,major_mark=major_mark,jinglishijian=lijingtime)
        uid.is_exam=True
        uid.save()
        mark.save()
        return render(request,'score.html',context={"total_mark":total_mark,"base_mark":base_mark,"promote_mark":promote_mark,"major_mark":major_mark})
#打印所有題目的正確答案
def re(request):
    option_list = []
    options=Question.objects.all()
    for option in options:
        option_list.append(option.correct_op)
    return option_list
#獲取每一道題的分數
def fenshu(request):
    fenshu_list = []
    fenshus=Question.objects.all()
    for fenshu in fenshus:
        fenshu_list.append(fenshu.mark)
    return fenshu_list
#返回用了多長時間
def rtdtime(s, e):
    return e - s
#返回時間分鐘
def rttime(s):
    if not s//60:
        return '{:.0f}秒'.format( s % 60)
    else:
        return '{:.0f}分,{:.0f}秒'.format(s // 60, s % 60)
#返回分數頁面
def mark01(request):
    uid=request.user
    print("uid:",uid)
    mark = Mark.objects.get(user=uid)
    print("mark:",mark)
    print("major_mark:",mark.major_mark)
    return render(request,"score1.html",context={"mark":mark})

1.django獲取各種形式的表單內容
2.django的日誌器引入的方法
3.migrate出錯時處理
4.django實現考試系統優化2
5.django考試試卷的實現【1】
6.計算分數算法
7.Django+xadmin+echarts在後臺動態顯示echarts圖表,實現後臺定製化開發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章