Я все еще очень плохо знаком с python, и в настоящее время я работаю над тестом с несколькими вариантами ответов. Каждый тест может иметь разное количество вопросов, и каждый вопрос может иметь различное количество вариантов. Тем не менее, с учетом сказанного, я мог бы использовать фиксированное количество вариантов, таких как четыре.
У меня есть база данных:
class Question(Base):
"""
a record for each question for the quizes
"""
__tablename__ = "questions"
id = Column(Integer, primary_key=True)
book_id = Column(Integer, ForeignKey("books.id"), unique=False, nullable=False)
chapter_id = Column(Integer, ForeignKey("chapters.id"), unique=False, nullable=False)
question = Column(String(128), unique=False, nullable=False)
choice1 = Column(String(128), unique=False, nullable=False)
choice2 = Column(String(128), unique=False, nullable=False)
choice3 = Column(String(128), unique=False, nullable=False)
choice4 = Column(String(128), unique=False, nullable=False)
correct = Column(Integer, unique=False, nullable=False)
def __repr__(self):
return "< Question - id: {} book_id: {} chapter_id: {} question: {} {} {} {} {} {} {} >".format(
self.id,
self.book_id,
self.chapter_id,
self.question,
self.choice1,
self.choice2,
self.choice3,
self.choice4,
self.correct
)
Я могу сделать это:
- установка фиксированного количества полей формы в WTForms
class QuizForm(Form):
q1 = RadioField(validators=[InputRequired()])
q2 = RadioField(validators=[InputRequired()])
q3 = RadioField(validators=[InputRequired()])
q4 = RadioField(validators=[InputRequired()])
cancel = SubmitField("Cancel")
- с использованием RadioField в WTForms, что ограничивает ответ одним ответом на вопрос.
- установка вариантов для каждого вопроса отдельно:
form = QuizForm(request.form)
form.q1.choices = [
("1", questions[0].choice1),
("2", questions[0].choice2),
("3", questions[0].choice3),
("4", questions[0].choice4)
]
form.q2.choices = [
("1", questions[1].choice1),
("2", questions[1].choice2),
("3", questions[1].choice3),
("4", questions[1].choice4)
]
. . .
- отображение каждого вопроса и вариантов отдельно:
<div class="grid-quiz">
<p>1</p>
<p>{{ questions[0].question }}</p>
<p></p>
<div class="grid-quiz">
{% for q1 in form.q1 %}
<p>{{ q1(class="quiz-input") }}</p>
<p>{{ q1.label(class="quiz-label") }}</p>
{% endfor %}
</div>
<hr>
</div>
<div class="grid-quiz">
<p>2</p>
<p>{{ questions[1].question }}</p>
<p></p>
<div class="grid-quiz">
{% for q2 in form.q2 %}
<p>{{ q2(class="quiz-input") }}</p>
<p>{{ q2.label(class="quiz-label") }}</p>
{% endfor %}
</div>
<hr>
</div>
. . .
Как я уже сказал, это работает, но это не чувствует себя эффективным. Я потратил время, пытаясь найти способы использования диктов, вложенных диктов, списков, вложенных списков и многого другого, но я не смог заставить что-либо работать.
Любое руководство будет оценено по достоинству.