python - 如何从数据库中获取值以为循环形式的输入创建动态名称?
问题描述
我正在一个使用 HTML、Python、SQL 和 Flask 的网站上工作,我遇到了一个问题,因为在一部分中我想使用数据库中名为抽认卡的表中的数据进行测验,其中包括以下列:
id_flashcard (INT) | 语言(文本) | 字(文本) | 定义(文本) | user_id (INT)
编辑:数据库结构 users.db
[表] 抽认卡
id_flashcard (INT) | language (TEXT) | word (TEXT) | definition (TEXT) | user_id (INT)
1 | Italian | il gatto | the cat | 2
[表格] 语言
language (TEXT) | flashcards (INT)| quiz (INT) | average (REAL) | user_id (INT)
Italian | 1 | 0 | 0.0 | 2
[表] 测验
user_id (INT) | language (TEXT) | n_flashcards (INT)| correct_answers (INT) | avg_quiz (REAL) | date (DATETIME)
[表格]用户
id (INT) | username (TEXT) | hash (TEXT)
为了完成这个测验,我循环了一个表格,该表格包含测验所需的所有卡片(在前一页中,用户可以选择语言),显示定义并让用户写下正确的“单词”。现在,我的第一个问题是我需要能够为每个输入提供某种标识符,以便我可以在提交后检索答案。
这是我经过多次尝试后得到的:
HTML 表单:
<form action="/quiztab" method="post">
{% for card in db_user %}
<div class="form-group row roundform">
<label for="staticEmail" class="col-sm-5 col-form-label" name="def_quiz[{{ card['id_flashcard'] }}]">{{ card["definition"] }}</label>
<div class="col-sm-10">
<input autocomplete="off" class="form-control roundform" type="text" name="answer[{{ card['id_flashcard'] }}]" placeholder="Write here the correct translation!">
</div>
</div>
{% endfor %}
<button class="roundbutton mt-5" type="submit">Give me the results!</button>
</form>
应用:
def quiztab():
quiz_language = session.get('quiz_language', None)
user_id = session["user_id"]
overview_languages = db.execute("SELECT * FROM languages WHERE user_id = :user_id", user_id = user_id)
db_user = db.execute("SELECT * FROM flashcards WHERE user_id = :user_id AND language = :quiz_language", user_id = user_id, quiz_language = quiz_language)
cards = db.execute("SELECT word, definition FROM flashcards WHERE user_id = :user_id AND language = :quiz_language", user_id = user_id, quiz_language = quiz_language)
n_cards = db.execute("SELECT COUNT(*) as count FROM flashcards WHERE user_id = :user_id AND language = :quiz_language", user_id = user_id, quiz_language = quiz_language)[0]["count"]
id_flashcards = db.execute("SELECT id_flashcard FROM flashcards WHERE user_id = :user_id AND language = :quiz_language", user_id = user_id, quiz_language = quiz_language)
answer = []
def_quiz = []
if request.method == "POST":
answer.append(request.form.get("answer[{{ card['id_flashcard'] }}]"))
def_quiz.append(request.form.get("def_quiz[{{ card['id_flashcard'] }}]"))
results = 0
for x in answer:
for y in def_quiz:
correct_word = db.execute("SELECT word FROM flashcards WHERE user_id = :user_id AND language = :quiz_language AND definition = :definition", user_id = user_id, quiz_language = quiz_language, definition = def_quiz)
if correct_word == answer:
results = results + 1
else:
results = results
add_quiz = db.execute("UPDATE languages SET quiz = quiz + 1 WHERE user_id = :user_id AND language = :quiz_language", user_id = user_id, quiz_language = quiz_language)
avg = ((results / n_cards) * 100)
update_quizzes = db.execute("INSERT INTO quizzes (user_id, language, n_flashcards, correct_answers, avg_quiz) VALUES (:user_id, :language, :n_flashcards, :correct_answers, :avg)", user_id = user_id, language = quiz_language, n_flashcards = n_cards, correct_answers = results, avg = avg)
answer = []
def_quiz = []
return redirect("/quiz")
else:
return render_template("quiztab.html", db_user = db_user, id_flashcards = id_flashcards)
不幸的是,我仍然不可能获得输入并基本上检查它们是否正确,而且由于我还是初学者,我发现自己不知道如何解决和解决这个问题。
任何帮助都深表感谢:)
解决方案
由于我无法重现您的所有代码,因此我在这里提供了一个最小的示例,您可以从中汲取灵感
应用程序.py:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/home", methods=['GET', 'POST'])
def home():
# Suppose that after the sql request the data is in this form
quiz = [{'id': 1, 'def_quiz': 'il gato', 'answer': 'the cat'},
{'id': 2, 'def_quiz': 'il cane', 'answer': 'the dog'}]
if request.method == "POST":
# I convert the form's data to dictionary
data = request.form.to_dict()
# this gives me a dictionary of the form {'def_quiz_id': 'answer_typed'}
# {'1': 'the cat', '2': 'the dog'}
print(data)
result = 0
for def_quiz, answer in data.items():
print(def_quiz, answer)
# replace this line with your sql request
recorded_answer = [q for q in quiz if q['id'] == int(def_quiz)][0]['answer']
print("the answer recorded", recorded_answer)
if recorded_answer == answer:
result += 1
print("result: ", result)
# the rest of your code here...
return render_template('home.html', quiz=quiz)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
模板/home.html:
<!DOCTYPE html>
<form action="/home" method="post">
{% for q in quiz %}
<div class="form-group">
<label>{{ q["def_quiz"] }}</label>
<div>
<input type="text" name="{{ q['id'] }}" placeholder="Write here the correct translation!">
</div>
</div>
{% endfor %}
<button type="submit">Give me the results!</button>
</form>
推荐阅读
- html - 平铺元素从我的父元素的一半开始,而不是从父元素的左侧开始
- blockchain - 从比特币区块链数据结构中提取钱包 ID(公钥)
- c++ - 使用带有向量的 boost::object_pool 时指针无效
- c# - 我应该在这里使用“使用”语句还是保持原样?
- c# - 如何有效地打破 C# 中的双循环?
- javascript - 面试编码时如何在短时间内用javascript实现队列?
- mysql - 这种僵局会如何发生?
- r - tmap facetmap 不适用于 tm_fill 但适用于 tm_symbols
- python - 使用 matplotlib 代理艺术家将图例添加到并行协调图中
- javascript - JavaScript:insertBefore 触发器“NotFoundError:找不到节点”