python - 是否可以访问用 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 的数据库表中。
解决方案
不幸的是,我以不同的方式解决了它。不是最好的,但应该没问题。我所做的只是添加值为 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'))