【问题标题】:Django forms - need a form that shows a set of questions each question having a list of possible answersDjango 表单 - 需要一个显示一组问题的表单,每个问题都有一个可能的答案列表
【发布时间】:2021-11-20 20:44:40
【问题描述】:

我有以下三个模型:

models.py

class Exam(models.Model):
    lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name="exams")
    passing_grade = models.IntegerField(default=85)
    must_pass = models.BooleanField(default=True)
    to_next_lesson = models.BooleanField(default=True)
    display_order = models.IntegerField(default=1)


class ExamQuestion(models.Model):
    exam = models.ForeignKey(Exam, on_delete=models.CASCADE, related_name="questions")
    text = models.CharField('Question', max_length=255)


class ExamAnswer(models.Model):
    question = models.ForeignKey(ExamQuestion, on_delete=models.CASCADE, related_name="answers")
    text = models.CharField('Answer', max_length=255)
    is_correct = models.BooleanField('Correct answer', default=False)

我需要的表格会在考试中大致呈现每个问题(抱歉无法显示呈现的 html 问题:

<form>
<div>
"Quality" is one our core values<br />
<input type="radio"/> True <br />
<input type="radio"/> False
</div>
<div>
What should you do if you see an employee stealing?<br />
<input type="radio"/> Report it to your manager<br />
<input type="radio"/> Call the police<br />
<input type="radio"/> Confront the employee<br />
</div>
<div>
<input type="submit"> 
</div>
</form>

忽略不完整且可能愚蠢的 HTML(此处显示概念的基本框架)如何让 Django 表单语言输出每个单独的问题,并在其下方提供多个答案?
注意:问题的数量是可变的,有些考试可能有 3 个问题,有些可能有 5 或 6 个。每个问题的答案数量也是可变的,有些问题可能有两个答案 - 通常是对或错,其他可能有四个或五个答案(现在每个问题只有一个正确答案,所以总是使用单选按钮)

视图中的查询被发送考试的 pk,并从 ExamQuestion 和 ExamAnswer 表中提取适当的文本条目。

我可以将问题和答案放入模板所需的任何查询集、列表或字典中,但我无法弄清楚如何让它们在模板中正确显示。

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    在 Django 表单中,您只需:

    
    STEALING= [
        ('Report it to your manage', 'Report it to your manage'),
        ('Call the police', 'Call the police'),
        ('Confront the employee', 'Confront the employee')
        ]
    
    class UserForm(forms.Form):
        your_form_field_name = forms.CharField(label='What should you do?', widget=forms.Select(choices=STEALING))
    

    【讨论】:

    • 好的,问题和答案是在运行时从查询中得出的。所以我创建了一个包含答案的元组列表。您在 Userform 类中显示 your_form_field_name。在用户选择实际考试之前,我不知道有多少问题。所以表单可能有 3 或 10 个字段。它会因考试而异。在这种情况下,列表(您称之为 STEALING)实际上必须是列表列表,每个列表都是元组列表(每个问题的答案)。我能做到。由于问题的数量不同,如何设置可变数量的字段名称?
    • 您可以将选项添加到您的视图中,然后根据查询执行 if 语句。我找到了这个答案stackoverflow.com/questions/47893324/…
    【解决方案2】:

    我从来没有找到使用forms.py 中的表单来处理这个问题的方法,所以我只是在视图(控制器)中创建了所需的HTML,将它传递给模板并显示它。 每个问题所需的 HTML 类似于我在问题中显示的内容:显示问题的 div,然后在每个 div 中创建单选按钮(添加适当的 name="" 属性以创建单选组)和可能的答案.对从数据库中检索到的尽可能多的问题和答案重复此操作。

    这很好,给了我我需要的结果。

    从我的研究中可以看出,基本 Django 表单通常是为大多数人认为的表单而设计的:需要填写的一系列字段(包括表单集中的多个此类表单)而不是更多一种调查形式,其中有一个问题,然后有多个答案可供选择。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2012-07-18
      • 2020-02-14
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多