Передача данных из нескольких форм / Массив одинаковой формы flask wtforms python - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь создать приложение flask, которое извлекает вопросы из базы данных sqlite, а затем позволяет отправлять оценки и комментарии по каждому вопросу. У меня возникают проблемы с пониманием того, как создавать формы для всех вопросов, и я не могу передать данные из форм обратно в мое приложение flask. Моя текущая веб-страница выглядит следующим образом:

Текущая веб-страница

Файл html, который я использую для создания этого файла, выглядит следующим образом:

запись. html

<doctype html="">
{% from "_formhelpers.html" import render_field %}
<form method="post">
  <table>
    {% for key, value in form_dict.items() %}
        <TR>
          {% set x = key[4:]|int %}
          <TD class="c1">{{ question_list[x-1] }}</TD>
          <TD class="c1">{{ key }}</TD>
          <TD class="c2">{{ render_field(value.score) }}</TD>
          <TD class="c3">{{ render_field(value.comment) }}</TD>
        </TR>
    {% endfor %}
  </table>
    <p><input type="submit" value="Submit"></p></form>
</doctype>

И код python / flask выглядит следующим образом:

class Record_Form(Form):

    score_choices = [('0.00', '0.00'),
                     ('0.25', '0.25'),
                     ('0.50','0.50'),
                     ('0.75','0.75'),
                     ('1.00','1.00')]
    score = SelectField('Score', choices=score_choices)
    comment = StringField('Comment')
    owner = StringField('Owner')

@app.route('/record/<id>', methods=['GET', 'POST'])
def new_record(id):
    form = Record_Form(request.form)
    question_list_qry = Question.query.all()
    question_list = []
    question_ids_list = []
    for i in question_list_qry:
        question_list.append(i.question)
        question_ids_list.append(i.id)

    form_dict={}
    for id in question_ids_list:
        form_dict[f'form{id}'] = Record_Form(request.form)

    if request.method == 'POST' and form.validate():

        print(form_dict['form1'].score.data)
        print(form_dict['form2'].score.data)
        print(form_dict['form3'].score.data)

        print(form_dict['form1'].comment.data)
        print(form_dict['form2'].comment.data)
        print(form_dict['form3'].comment.data)

        return redirect('/')
    return render_template('record.html', question_list=question_list, form_dict=form_dict)

В настоящее время, если я go в мой * Приложение 1036 * и отправьте три разных балла и три разных комментария в первых трех вопросах. Результирующий вывод только из "form1".

Три разных оценки и комментарии

Но это вывод, который я получаю:

0.25
0.25
0.25
Dog
Dog
Dog

Что я делаю неправильно? Я думаю, что это как-то связано с form.validate, но я не уверен.

Вот рендеринг HTML:

<form method="post">
  <table>

        <TR>

          <TD class="c1">Question 1</TD>
          <TD class="c1">form1</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 2</TD>
          <TD class="c1">form2</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 3</TD>
          <TD class="c1">form3</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 4</TD>
          <TD class="c1">form4</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 5</TD>
          <TD class="c1">form5</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 6</TD>
          <TD class="c1">form6</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 7</TD>
          <TD class="c1">form7</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 8</TD>
          <TD class="c1">form8</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 9</TD>
          <TD class="c1">form9</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 10</TD>
          <TD class="c1">form10</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 11</TD>
          <TD class="c1">form11</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

        <TR>

          <TD class="c1">Question 12</TD>
          <TD class="c1">form12</TD>
          <TD class="c2">
    <dt><label for="score">Score</label>
    </dt><dd><select id="score" name="score"><option value="0.00">0.00</option><option value="0.25">0.25</option><option value="0.50">0.50</option><option value="0.75">0.75</option><option value="1.00">1.00</option></select>

    </dd>
</TD>
          <TD class="c3">
    <dt><label for="comment">Comment</label>
    </dt><dd><input id="comment" name="comment" type="text" value="">

    </dd>
</TD>
        </TR>

  </table>
    <p><input type="submit" value="Submit"></p></form>
</doctype>

1 Ответ

0 голосов
/ 06 марта 2020

Это потому, что у вас одинаковые name для всех тегов select и всех тегов input. Вам нужно использовать разные имена для них, если все они находятся в одном поле, иначе они будут перезаписаны друг другом.

запись. html

<doctype html="">
{% from "_formhelpers.html" import render_field %}
<form method="post">
  <table>
    {% for key, value in form_dict.items() %}
        <TR>
          {% set x = key[4:]|int %}
          <TD class="c1">{{ question_list[x-1] }}</TD>
          <TD class="c1">{{ key }}</TD>
          <TD class="c2">{{ render_field(value.score, name='score'+str(x)) }}</TD>
          <TD class="c3">{{ render_field(value.comment, name='comment'+str(x)) }}</TD>
        </TR>
    {% endfor %}
  </table>
    <p><input type="submit" value="Submit"></p></form>
</doctype>

Вам также необходимо изменить код сервера следующим образом:

form_dict['form1']['score1']
form_dict['form2']['score2']
form_dict['form3']['score3']
...