首页 > 解决方案 > 是否可以访问用 jinja2 循环的表单输入?

问题描述

我有这个表格来回答用户在 html 文件中收到的调查。

<form method="POST" action="/answerSurvey">
  <ol>
    {% for q in questions %}
    <li>
      <label for="questionBody"><b>{{ q.body }}</b></label>
      <ul style="list-style: none;">
        {% for a in answers %}
        {% if q.id == a.question_id %}
        <li><input type="checkbox" name="{{ a.id }}"> {{ a.body }}</li>
        {% endif %}
        {% endfor %}
      </ul>
    </li>
    {% endfor %}
  </ol>
  <button type="submit">Submit</button>
</form>

我想创建一个函数来接收用户输入以查看选中了哪些问题。类似的东西

@app.route('/answerSurvey', methods=['GET', 'POST'])
@login_required
def answerSurvey():
    question_answers = request.form['something']

所以我可以将它们存储在具有关联 answer.id 的数据库表中。

标签: pythonhtmlflaskjinja2flask-sqlalchemy

解决方案


不幸的是,我以不同的方式解决了它。不是最好的,但应该没问题。我所做的只是添加值为 1 的复选框输入。当答案被勾选时,这会将 1 写入数据库。因为它只在有东西打勾时才写,所以我需要添加一个隐藏的输入字段,所以也采用未打勾的值。问题是,当用户勾选特定问题的答案时,它首先创建值 1,然后创建值 0。假设有两个问题,每个问题有两个答案。然后让我们假设每个问题的第一个答案是正确的。然后我将得到值 [1, 0, 0, 1, 0, 0]。由于我对 JavaScript 不是很好,所以我使用 Python 来解决我的问题。我删除了每个 1 右侧的条目。

这是我在 html 中的新代码。它基本上将复选框的值存储在答案中,分配多个值时将更改为列表。(我假设,它也可以是一个列表)无论如何,当调用 request.form 我确实使用 getList() 从复选框中获取所有值。

<form method="POST" action="/answerSurvey">
  <ol>
    {% for q in questions %}
    <li>
      <label for="questionBody"><b>{{ q.body }}</b></label>
      {% for a in answers %}
      {% if q.id == a.question_id %}
      <input type="checkbox" name="answers" id="answers" value="1">
      <input type="hidden" name="answers" id="answers-hidden" value="0">
      <label for="answers">{{ a.body }}</label>
      <br>
      {% endif %}
      {% endfor %}
    </li>
    {% endfor %}
  </ol>
  <button type="submit">Submit</button>
</form>

这是python中的代码。我正在向后循环,因为在删除项目时列表越来越小,并且在随着索引的增加而循环时会导致 IndexOutOfBoundsException。

@app.route('/answerSurvey', methods=['POST'])
@login_required
def answerSurvey():
    answers_user = request.form.getlist('answers')

    for i in range(len(answers_user)-1, -1, -1):
        if answers_user[i] == '1':
            del answers_user[i + 1]

    ...

    return redirect(url_for('dashboard'))

推荐阅读