Django+xadmin打造在线考试系统2.0
前期利用业余时间开发了一个在线考试系统,大家关注度还比较高,因此从构建过程详细写了一套制作,部署的教程:
公众号上发布后,大家提出了很多改进建议,本想及时修改,但是一直拖到今天才实现,下面就介绍一下全新的在线考试系统2.0。
本次修改在原有基础上增加了以下功能:
image红字部分为新加功能,此外整个系统也改头换面,个人前端能力不是很强,做到这一步也是尽力了。
image由于前期已经详细讲过基础的知识,本篇文章只对新增功能进行讲解。
/1/考试界面
1.0版本时只是将试题呈现在页面上,没有能显示做题进度和定位功能,因此2.0着重对试卷页面进行了美化。
将各类题型分开显示:
image答题卡部分通过JavaScript模板,实现对题目定位,以显示进度。
image为解决1.0版本代码写作过于死板的问题,在exams/models中详细定义了试卷列表类,可以有效获取试卷的基本信息,为页面显示提供便利,其中random_paper为试卷类型,是标识试卷为随机抽题还是固定题目试卷:
class PaperList(models.Model):#用于查看往期考试题目可能不用
course = models.ForeignKey(CourseList, verbose_name=u"所属课程",on_delete=models.CASCADE)
name = models.CharField(max_length=100, verbose_name=u"试卷名", default=u"")
is_allow = models.BooleanField(default=False, verbose_name=u"启用随机组卷")
add_time = models.DateField(default=datetime.now, verbose_name=u"开考时间")
single_choice_num = models.IntegerField(verbose_name=u"单选题数", default=0)
single_choice_score = models.IntegerField(verbose_name=u"单选分值", default=0)
judgment = models.IntegerField(verbose_name=u"判断题数", default=0)
judgment_score = models.IntegerField(verbose_name=u"判断分值", default=0)
multiple_choice_num = models.IntegerField(verbose_name=u"多选题数", default=0)
multiple_choice_score = models.IntegerField(verbose_name=u"多选分值", default=0)
random_paper = models.BooleanField(default=True, verbose_name=u"随机卷")
/2/训练界面
训练界面为了实现刷题的功能,从题库中读取试题,设置上下翻、显示答案、收藏、提交答案、退出训练功能。
image其中通过退出训练键,将用户训练的进度储存在UserRecord数据表中。
class UserRecord(models.Model):#刷题模式下记录到哪一个题目
user = models.ForeignKey(UserProfile, verbose_name=u"用户",on_delete=models.CASCADE)
course = models.ForeignKey(CourseList, verbose_name=u"课程",on_delete=models.CASCADE)
question = models.ForeignKey(Question, verbose_name=u"题目",on_delete=models.CASCADE)
add_time = models.DateField(verbose_name=u"录入时间",default=datetime.now)
这样用户每次点击都会进入自己上次的进度处。
/3/收藏界面
收藏部分主要分为收藏、查看收藏结果、取消收藏。收藏功能通过按钮触发,对已收藏的显示已收藏,对成功收藏的显示收藏成功。
def collect(request,question_id):
questions = Question.objects.filter(id=question_id)
for question in questions:
a = question
if not UserCollection.objects.filter(user=request.user,question_id=question_id):
User_Collection = UserCollection()
User_Collection.user_id = request.user.id
User_Collection.question_id = a.id
User_Collection.add_time = datetime.now()
User_Collection.course_id = a.course_id
User_Collection.save()
string = '<h5>收藏成功</h5>'
return HttpResponse(string)
else:
string = '<h5>您已经收藏过该题了</h5>'
return HttpResponse(string)
image
image
查看收藏为根据用户id进行数据表查询:
def enquire_collect(request):
if request.user.is_authenticated:
collections = UserCollection.objects.filter(user_id=request.user.id)
question_list = []
for collection in collections:
a = Question.objects.get(pk=collection.question_id)
question_list.append(a)
# question_list = tuple(question_list)
return render(request, 'collection.html', {"question_list": question_list,})
else:
return render(request, "login.html", {"msg": u'为保护用户信息,不对未登录用户开放'})
image
取消收藏是对数据表进行删除。
def del_collect(request,question_id):
UserCollection.objects.get(id=question_id,user_id=request.user.id).delete()
return redirect('/operations/enquire_collect/')
下篇文章将重点对主界面设计和用户管理模块进行讲解,此外将对试用版源代码进行开源,欢迎大家提意见。
关注公众号,获取海量学习资源。
image1024程序开发者社区的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里就技术问题进行交流,还没有加入的小伙伴可以扫描下方“社区物业”二维码,让管理员帮忙拉进群,期待大家的加入。
image//猜你喜欢//