Django forms - нужна форма, которая показывает набор вопросов, каждый вопрос имеет список возможных ответов
У меня есть следующие три модели:
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. Количество ответов на каждый вопрос также переменное, некоторые вопросы могут иметь два ответа - обычно истина или ложь, другие могут иметь четыре или пять ответов (сейчас для каждого вопроса есть только один правильный ответ, поэтому всегда используются радиокнопки)
Запрос в представлении получает пк экзамена и извлекает соответствующие текстовые записи из таблиц ExamQuestion и ExamAnswer.
Я могу поместить вопросы и ответы в любой набор queryset, список или словарь, необходимый для шаблона, но я не смог понять, как заставить их правильно отображаться в шаблоне.
В формах 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))
Я так и не нашел способа сделать это с помощью формы в forms.py, поэтому я просто создал необходимый HTML в view(controller), передал его в шаблон и отобразил его. HTML, необходимый для каждого вопроса, был аналогичен тому, что я показал в вопросе: div, показывающий вопрос, затем в каждом div после этого создаются радиокнопки (добавляя соответствующий атрибут name="" для создания радиогруппы) и возможные ответы. Повторяя это для такого количества вопросов и ответов, которые были получены из базы данных.
Это сработало идеально, дало именно те результаты, которые мне были нужны.
Насколько я могу судить по своим исследованиям, базовые формы Django Forms в целом предназначены для того, что большинство людей считают формой: Серия полей, которые нужно заполнить, (включая несколько таких форм в наборе форм), а не формат опроса, где есть вопрос, а затем несколько ответов на выбор.