本次优化将针对考题部分,实现计算考试所用时间,并实现没有填写地址不能进行测试的功能。
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图表,实现后台定制化开发