pythondjangodjango

Django+xadmin打造在线考试系统2.0

2019-08-24  本文已影响17人  f5065e26181b

前期利用业余时间开发了一个在线考试系统,大家关注度还比较高,因此从构建过程详细写了一套制作,部署的教程:

公众号上发布后,大家提出了很多改进建议,本想及时修改,但是一直拖到今天才实现,下面就介绍一下全新的在线考试系统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/')

下篇文章将重点对主界面设计和用户管理模块进行讲解,此外将对试用版源代码进行开源,欢迎大家提意见。

关注公众号,获取海量学习资源。

image

1024程序开发者社区的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里就技术问题进行交流,还没有加入的小伙伴可以扫描下方“社区物业”二维码,让管理员帮忙拉进群,期待大家的加入。

image

//猜你喜欢//

上一篇下一篇

猜你喜欢

热点阅读