对于QUIZ Django项目,我们有一个几乎准备好的后端来创建问题和答案。现在,我想知道,我们将如何组织这个测验?关于这一点的一些观点:
我从这个想法开始,但我无法超越计时器的事情。我们如何实现这个?思路:
答案 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
个会话。但Django
为NOT
。
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
这解决了如何安排有答案的问题,其中一些是正确的。
我将尽快更新考试解决方案。