代码之家  ›  专栏  ›  技术社区  ›  Arindam Roychowdhury

如何为Django测验应用程序中出现的候选人创建测验体验

  •  0
  • Arindam Roychowdhury  · 技术社区  · 8 年前

    对于一个测验Django项目,我们有一个几乎准备就绪的后端,用于创建问题和答案。现在,我想知道,我们将如何组织这次测验?关于这一点的一些观点:

    • 开始测验,测验将抛出N个不同的问题。学生登录或只输入一些基本信息,如电子邮件和姓名,然后开始,比如说一些按钮“开始测验”。
    • 还应显示计时器,指示剩余时间。如果不同的问题需要不同的计时器怎么办。喜欢2分钟的难题,但简单的只有1分钟。
      • 用户应无法通过任何方式重置此计时器(重新提交页面或 重新启动测验)。
      • 需要有一个结果页才能显示摘要。这个“结果”应该是一个模型吗?(我想是的)。
      • 我们如何确保用户不能重考?

    我是从这个想法开始的,但我无法超越计时器这件事。我们如何实现这一点?想法:

    • 我们应该使用Django会话吗?怎样
    • 或者这应该使用Javascript?完成?。
    • 如果客户机告诉服务器时间快到了,或者后端服务器应该发送信号。
    2 回复  |  直到 8 年前
        1
  •  1
  •   alioguzhan    8 年前

    我会尽力回答他们:

    开始测验,测验将抛出N个不同的问题。学生登录或只输入一些基本信息,如电子邮件和姓名,然后开始,比如说一些按钮“开始测验”。

    这实际上取决于应用程序的其余部分。如果这只是一个一次性测验应用程序,并且该应用程序中不存在其他功能,那么您不必实现身份验证系统。但是,如果用户可以在不同的时间进行多个测验,并且您希望将所有这些测验都保存在一个用户帐户下,那么最好实现一个用户帐户系统。

    还应显示计时器,指示剩余时间。如果 不同的问题需要不同的计时器。喜欢难题2 分钟,但简单的只有1分钟。

    我会创建一个 Question 模型通过这种方法,您可以为每个特定问题设置不同的计时器值。如果计时器值变化不大,并且只有一些问题的计时器值不同,我会为此模型字段设置一个默认值,这样我就不必为每个问题指定值,只需为困难的问题指定值。

    timer = models.SmallIntegerField(default=60) # timer value in seconds

    用户应无法通过任何方式重置此计时器(重新提交 页面或重新启动测验)。

    唯一的解决方案是只在后端启动和监视计时器。客户端的一切都可以被操纵。但计时器是 real-time like 概念我可以想出两种可能的解决方案:

    • 使用 Websockets :只需在后端创建一个连接到计时器的事件,并在客户端侦听该事件。这样,您就可以在客户端显示准确的剩余时间,并且可以确保它没有被操纵。 This 是关于如何构建倒计时系统web套接字的第一篇文章。我相信你能找到更多。

    • 两个计时器:在后端启动计时器,然后在客户端呈现问题页面。并根据后端计时器的值在客户端启动第二个计时器。在这种情况下,两个计时器之间可能存在毫秒级的差异(因为响应时间),我认为您可以容忍。我从未尝试过这种方法。我会选择websocket解决方案。但是,如果使用websockets不是一个选项,那么您可以考虑这个选项。

    需要有一个结果页才能显示摘要。如果这是“结果” 做个模特?(我想是的)。

    我想 Yes 。即使您的应用程序是一次性测验应用程序,您也可能希望保留测验结果,以允许用户 share 他们的结果将在稍后公布。A. Result 模型就可以了。

    我们如何确保用户不能重考?

    我们不能/不能。他们可以用不同的证书参加新的测验。即使你保留并检查 IP Address of user 出于唯一性目的,可以重置和更改。我认为没有完全的解决办法。当然,你应该检查一下 e-mail address 测验初始页上的用户。

    我们应该使用Django会话吗?怎样

    是的,您可以使用 Django 会话。但是 NOT 对于 the timer thing

    Django会话可以帮助您在整个测验过程中跟踪用户。您可以使用以下内容存储与测验或会话中的用户相关的数据:,

    request.session['e-mail'] = '....'
    

    但如果您实现一个身份验证系统,事情就会变得更容易。


    上述解决方案可能不是最适合您的方案。但我希望他们能给你一些基本的想法。

        2
  •  0
  •   Arindam Roychowdhury    7 年前

    这就是我最终实现它的方式。请记住,我使用的是Python 2.7和Django 1.11。所以web套接字是不可能的。

    我的型号:

    class Question(models.Model):
        description = models.CharField('Description', max_length=300)
        difficulty_choice = (
            ('H', 'Hard'),
            ('M', 'Medium'),
            ('E', 'Easy'),
        )
    
        difficulty = models.CharField(
            max_length=3,
            choices=difficulty_choice,
            default='M'
                        )
    
        skill = models.ForeignKey(Skill, null=True)
        qset = models.ManyToManyField(QuestionSet)
    
        def __str__(self):  # __unicode__ on Python 2
            return "{0}".format(self.description)
    
        def get_absolute_url(self):
            return reverse('Evaluator:question_details', args=[str(self.id)])
    
    
    class Answer(models.Model):
        """
        Answer's Model, which is used as the answer in Question Model
        """
        detail = models.CharField(max_length=128, verbose_name=u'Answer\'s text')
        question = models.ForeignKey(Question, null=True)
        correct = models.BooleanField('Correct', default=True)
    
        def __str__(self):
            return self.detail
    

    这就解决了如何安排有答案的问题,其中一些问题是正确的。

    我将很快更新考试答案。