为Django Quiz app

时间:2018-03-15 06:30:49

标签: python django

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

  • 开始测验,这将引发N diff问题。所以学生登录或只输入一些基本信息,如电子邮件和姓名,然后开始,让我们说一些按钮"开始测验"。
  • 还应显示一个指示剩余时间的计时器。如果不同的问题需要不同的计时器怎么办像困难的问题2分钟,但容易的只有1分钟。
    • 用户不能以任何方式重置此计时器(重新提交页面或 重启测验。。
    • 需要有一个结果页面来显示摘要。这应该"结果"做个模特? (我想是的)。
    • 我们如何确保用户无法重考?

我从这个想法开始,但我无法超越计时器的事情。我们如何实现这个?思路:

  • 我们应该使用Django会话吗?怎么样?
  • 或者这应该使用Javascript完成?
  • 客户端应该告诉服务器,时间是否已经结束,或者后端服务器是否应该发送信号。

2 个答案:

答案 0 :(得分:1)

我会尽力回答:

  

开始测验,这将引发N diff问题。学生登录也是如此,或者只是输入一些基本信息,如电子邮件和姓名,然后开始,让我们说一些按钮“开始测验”。

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

  

还应显示一个指示剩余时间的计时器。如果   不同的问题需要不同的计时器。像困难的问题2   分钟,但只有1分钟。

我会创建一个Question模型。使用此方法,您可以为每个特定问题设置不同的计时器值。如果计时器值没有太大变化,只有一些问题会有不同的计时器值,我会为这个模型字段设置一个默认值,所以我不必为每个问题指定一个值,而只需要给出困难的值。

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

  

用户不能以任何方式重置此计时器(重新提交   页面或重新启动测验。)

唯一的解决方案是仅在后端启动和观看计时器。客户端的一切都可以被操纵。但计时器是real-time like概念。我可以想到两个可能的解决方案:

  • 使用Websockets:只需在后端创建连接到计时器的事件,然后在客户端侦听该事件。这样,您可以在客户端显示确切的剩余时间,并确保不会对其进行操作。 This是关于如何构建倒计时系统Web套接字的第一篇文章。我相信你能找到更多。

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

  

需要有一个结果页面来显示摘要。应该这个“结果”   做个模特? (我想是的)。

我认为Yes。即使您的应用是一次性测验应用,您也可能希望保留测验结果,以便用户稍后{@ 1}}获得他们的结果。 share模型没问题。

  

我们如何确保用户无法重考?

我们不/不能。他们可以使用不同的凭据进行新的测验。即使您保留并检查Result的唯一性目的,也可以重置和更改。我认为没有完整的解决方案。但是,当然,您应该在测验的初始页面上查看用户的IP Address of user

  

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

是的,您可以使用e-mail address个会话。但DjangoNOT

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

the timer thing

但是,如果您实施身份验证系统,事情会更容易。

以上解决方案对您来说可能不是最好的解决方案。但我希望他们能为您提供一些基本想法。

答案 1 :(得分:0)

这就是我最终实现它的方式。请记住,我正在使用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

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

我将尽快更新考试解决方案。