Python / Flask / WTForms - повторение викторины с множественным выбором - PullRequest
0 голосов
/ 06 февраля 2020

Я все еще очень плохо знаком с 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>
. . . 

Как я уже сказал, это работает, но это не чувствует себя эффективным. Я потратил время, пытаясь найти способы использования диктов, вложенных диктов, списков, вложенных списков и многого другого, но я не смог заставить что-либо работать.

Любое руководство будет оценено по достоинству.

...