Python / Flask-WTF - Как я могу рандомизировать выбор из динамического RadioField?

1

Я хочу построить викторину с несколькими вариантами, используя python/flask/flask-wtf. Я успешно могу вытащить случайные вопросы из базы данных, а также выбрать случайные варианты в качестве возможных ответов. Я использую цикл for на странице шаблона, который сначала отображает вопрос, а затем возможные ответы.

Вот мой шаблон.

<div class="quote-block">
{% for quote in quotes %}
    {{ quote.line_text }}
    <form method="POST">
        {{ form.hidden_tag() }}
        {{ form.question }}
        <input type="submit">
    </form>
{% endfor %}
</div>

Моя проблема в том, что возможные ответы одинаковы для каждого вопроса и в том же порядке. Я понимаю, почему это происходит. Запрос в базу данных для выбора RadioField происходит только один раз. Затем результаты этого запроса вытягиваются для каждого экземпляра цикла for.

Вот мой маршрут.

@app.route('/quiz/', methods=['POST', 'GET'])
def quiz():
    quotes = Quotes.query.order_by(func.rand()).limit(5)
    form = Quiz()
    form.question.choices = [(choice.speaker_id, choice.speaker) for choice in Characters.query.order_by(func.rand()).limit(4)]
    return render_template('television/quiz.html', form=form, quotes=quotes, options=options)

И моя форма.

class Quiz(FlaskForm):
    question = RadioField('Label', choices=[])

Как я уже сказал, все это работает. Я просто не могу понять, как начать новый выбор для каждого вопроса. Любая помощь будет принята с благодарностью. Спасибо!

Теги:
flask-wtforms

2 ответа

0
Лучший ответ

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

Мой самый большой контрольно-пропускной пункт состоял в том, что я пытался выбрать случайные варианты выбора для RadioField. Вместо этого я добавил три столбца в таблицу базы данных и предоставил параметры в таблице. Это упростило выбор вариантов и вопроса одним запросом.

В принципе, я запускаю цикл for над полями в форме. Если поле является RadioField, оно запускает запрос к базе данных и вытягивает случайную строку. Затем я использую другую для цикла по вытащенному ряду и назначаю разные элементы кускам RadioField (метка, выбор).

Если вы знаете более элегантный способ сделать это, я бы хотел это услышать. Но пока это работает.

Моя форма и шаблон остались прежними. Но вот мой новый маршрут.

    @app.route('/quiz/', methods=['GET', 'POST'])
    def quiz():
        form = Quiz()
        for field in form:
            if field.type != "RadioField":
                continue
            else:
                pulls = Quotes.query.order_by(func.rand()).limit(1)
                for pull in pulls:
                    answer = pull.speaker
                    option_two = pull.option_two
                    option_three = pull.option_three
                    option_four = pull.option_four
                    question = pull.line_text
                    field.label = pull.line_text
                    field.choices = [(answer, answer), (option_two, option_two), (option_three, option_three), (option_four, option_four)]
            return redirect(url_for('you_passed'))
        return render_template('television/quiz.html', form=form)
0

Вы можете попробовать динамически расширить свой флажок:

def Quiz(number_of_questions):
    class _Quiz(FlaskForm):
        pass
    for n in range(number_of_questions):
        setattr(_Quiz, RadioField('Label', choices=[]), 'question_' + str(n))
    return _Quiz()

Теперь у вашей формы есть атрибут question_ [n] для каждого вопроса, чтобы вы могли повторить его в jijna2:

<div class="quote-block">
<form method="POST">
{{ form.hidden_tag() }}
{% for q_num in range(n) %}
    {{ quotes[q_num].line_text }}
    {{ form['question_' + q_num|string }}
{% endfor %}
<input type="submit">
</form>
</div>
  • 0
    Спасибо, что нашли время, чтобы ответить. Я не уверен, что понимаю, как именно это использовать. Как изменится мой маршрут просмотра?
  • 0
    Обнаружили ли вы также проблему, заключающуюся в том, что ваш маршрут просмотра генерирует только случайные ответы, и он не обязательно генерирует правильный ответ в наборе случайных ответов и не добавляет его в форму?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню