Python 如何从数据库中获取值,为循环形式的输入创建动态名称?
我在一个使用HTML、Python、SQL和Flask的网站上工作,我遇到了一个问题,因为在一个部分中,我想使用数据库中名为flashcards的表中的数据包括一个测验,其中包括以下列: id|U抽认卡(INT)|语言(文本)|单词(文本)|定义(文本)|用户id(INT)Python 如何从数据库中获取值,为循环形式的输入创建动态名称?,python,html,forms,flask,input,Python,Html,Forms,Flask,Input,我在一个使用HTML、Python、SQL和Flask的网站上工作,我遇到了一个问题,因为在一个部分中,我想使用数据库中名为flashcards的表中的数据包括一个测验,其中包括以下列: id|U抽认卡(INT)|语言(文本)|单词(文本)|定义(文本)|用户id(INT) 编辑:数据库结构users.db [表格]抽认卡 id_flashcard (INT) | language (TEXT) | word (TEXT) | definition (TEXT) | user_id (INT)
编辑:数据库结构users.db [表格]抽认卡
id_flashcard (INT) | language (TEXT) | word (TEXT) | definition (TEXT) | user_id (INT)
language (TEXT) | flashcards (INT)| quiz (INT) | average (REAL) | user_id (INT)
user_id (INT) | language (TEXT) | n_flashcards (INT)| correct_answers (INT) | avg_quiz (REAL) | date (DATETIME)
id (INT) | username (TEXT) | hash (TEXT)
[表格]语言
id_flashcard (INT) | language (TEXT) | word (TEXT) | definition (TEXT) | user_id (INT)
language (TEXT) | flashcards (INT)| quiz (INT) | average (REAL) | user_id (INT)
user_id (INT) | language (TEXT) | n_flashcards (INT)| correct_answers (INT) | avg_quiz (REAL) | date (DATETIME)
id (INT) | username (TEXT) | hash (TEXT)
[表格]测验
id_flashcard (INT) | language (TEXT) | word (TEXT) | definition (TEXT) | user_id (INT)
language (TEXT) | flashcards (INT)| quiz (INT) | average (REAL) | user_id (INT)
user_id (INT) | language (TEXT) | n_flashcards (INT)| correct_answers (INT) | avg_quiz (REAL) | date (DATETIME)
id (INT) | username (TEXT) | hash (TEXT)
[表格]用户
id_flashcard (INT) | language (TEXT) | word (TEXT) | definition (TEXT) | user_id (INT)
language (TEXT) | flashcards (INT)| quiz (INT) | average (REAL) | user_id (INT)
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>
不幸的是,我仍然不可能获得输入并基本上检查它们是否正确,因为我还是一个初学者,我发现自己不知道如何解决和处理这个问题
非常感谢您的帮助:)由于我无法复制您的所有代码,我在此提供一个简单的示例,您可以从中获得灵感 app.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>
{测验%中q的百分比}
{{q[“def_测验”]}
{%endfor%}
给我结果!
最后我选择了这种方法。当然,一切都可能变得更加优雅,但现在这对我来说是可行的:
if request.method == "POST":
data = request.form.to_dict()
result = 0
for x in range(len(data)):
check1 = int(list(data.keys())[x])
check2 = quiz[x]['id_flashcard']
check3 = list(data.values())[x]
check4 = quiz[x]['word']
if check1 == check2 and check3 == check4:
result += 1
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 = ((result / 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 = result, avg = avg)
sum_avg_quizzes = db.execute("SELECT SUM(avg_quiz) as sum FROM quizzes WHERE user_id = :user_id AND language = :quiz_language", user_id = user_id, quiz_language = quiz_language)[0]["sum"]
quiz_n = db.execute("SELECT COUNT(*) as count FROM quizzes WHERE user_id = :user_id AND language = :quiz_language", user_id = user_id, quiz_language = quiz_language)[0]["count"]
tot_avg_quizzes = sum_avg_quizzes / quiz_n
update_avg_quiz = db.execute("UPDATE languages SET average = :average WHERE user_id = :user_id AND language = :quiz_language", average = tot_avg_quizzes, user_id = user_id, quiz_language = quiz_language)
return redirect("/quiz")
谢谢你的帮助!:) 你能在你的问题中添加你的数据库模型吗?如果可能的话,还可以添加语言和抽认卡表中的记录示例吗?嗨@Tobin!我编辑了这个问题!到目前为止,到底是什么在起作用?你能画这首诗吗?你能提交任何东西吗?使用GET-quiztab渲染,一切似乎都正常,但一旦我提交表单,因此方法将更改为POST,即使我被正确重定向回/quiz,我也无法获取表单的输入(“应用程序中的回答”和“定义回答”)。我认为有问题的部分是当我尝试从表单获取所有输入时,因此在HTML中,我尝试获取一种标识,在应用程序中使用“request.form.get”。谢谢Tobin,我将尝试一下!我只是想知道,对于app.py中的“quick”,你指的是我的变量“db_user”?这部分仍然有一个问题:对于定义,在data.items()中回答:记录的答案=[q for q in db_user if q['id_flashcard']==int(definition)][0]['answer]打印(“记录的答案”,记录的答案)如果记录了_answer==answer:result+=1键错误:“answer”您可以更新您的答案,以便我可以准确地看到错误的原因吗?