Python 如何从数据库中获取值,为循环形式的输入创建动态名称?

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)

我在一个使用HTML、Python、SQL和Flask的网站上工作,我遇到了一个问题,因为在一个部分中,我想使用数据库中名为flashcards的表中的数据包括一个测验,其中包括以下列:

id|U抽认卡(INT)|语言(文本)|单词(文本)|定义(文本)|用户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”您可以更新您的答案,以便我可以准确地看到错误的原因吗?