2017-09-03 4 views
0

質問:htmlにはループがあり、サイクルごとにname = "answer []"という入力があります。私がしたいのは、pythonで入力からすべてのデータを受け取ることです。私の方法は "answer = request.form [" answer [] "]"ですが、最初の回答のみを受け取ります。すべての回答をhtmlから受け取るにはどうすればいいですか。htmlに同じ名前のいくつかの入力がある場合、pythonの受信方法

HTML:

<!doctype html> 
<html> 
<head> 
<title>fill_out page </title> 
</head> 
<body> 
<h1> answer page </h1> 
<Form method="POST"> 
{% for question in content %} 
Question{{ loop.index }} : &ensp; &ensp; {{ question }}<br></br> 
<input name="answer[]" placeholder="Enter your answer"/><br></br> 
{% endfor %} 
<button type="submit" name="bt">submit</button><br></br> 
</Form> 
<h2> if you want to switch account <a href="./index.html"> resign in</a></h2> 
</body> 
</html> 

のpython:

@app.route("/fill_out.html/<username>",methods=["GET", "POST"]) 
@app.route("/fill_out.html",methods=["GET", "POST"]) 
def fill_out(username=None) : 
    content=find_question() 
    if request.method=="POST" : 
     answer=request.form["answer[]"] 
     print(answer) 
     return redirect(url_for("congratulations",username=username)) 
    return render_template("fill_out.html",content=content) 

あなたは助けることができる場合、私は本当に

+0

私が間違っていない場合は、ウェブサイト**で**あなたがそれを投稿できなかった理由を教えてください! –

+0

なぜ私は投稿できないのではなく、文章は単なる文脈であり、問​​題はPythonです –

+0

コードが行うべきことをより正確に記述してください。 –

答えて

0

に感謝それはとてもそれが他の人にのために簡単ですMinimal, Complete, and Verifiable exampleとしてあなたの問題を投稿することが最善ですreporduce。このようになりますあなたの場合:

:あなたは(ファイルからまたは対話インタプリタセッションでそれを貼り付けて)これを実行すると

from flask import * 

app = Flask(__name__) 

template = """ 
<!doctype html> 
<html> 
<head> 
<title>fill_out page </title> 
</head> 
<body> 
<h1> answer page </h1> 
<Form method="POST"> 
{% for question in content %} 
Question{{ loop.index }} : &ensp; &ensp; {{ question }}<br></br> 
<input name="answer[]" placeholder="Enter your answer"/><br></br> 
{% endfor %} 
<button type="submit" name="bt">submit</button><br></br> 
</Form> 
<h2> if you want to switch account <a href="./index.html"> resign in</a></h2> 
</body> 
</html> 
""" 

@app.route("/fill_out.html/<username>",methods=["GET", "POST"]) 
@app.route("/fill_out.html",methods=["GET", "POST"]) 
def fill_out(username=None) : 
    if request.method=="POST" : 
     return render_template_string("Result: <pre>{{form}}</pre>", 
             form=request.form) 
    return render_template_string(template,content=["Q1", "Q2", "Q3"]) 

if __name__ == '__main__': 
    app.run() 

、あなたはどのように返さrequest.formルックス、例えばが表示されます

ImmutableMultiDict([('bt', ''), 
        ('answer[]', 'A1'), 
        ('answer[]', 'A2'), 
        ('answer[]', 'A3')]) 

MultiDictです。フォームの各フィールドに1つのエントリがあり、そのうち3つは同じ名前のanswer[]です。 []には何も特別なものはなく、フォームフィールド名の一部にすぎません。 htmlフォームが同じ名前の複数の要素を含むことは完全に有効です。[]を追加する必要はありません(phpがすべての提出された値の配列を作成するPHPイディオムですが、ここではPythonについて、だからそれについて忘れてください)。あなたはあなたの要素を単にanswerと呼ぶことができましたが、違いはありません。

かいつまんで、リストなど、すべての提出の回答が必要な場合は、使用:

answers = request.form.getlist('answer[]') 

次にあなたがリストの上にanswers[0]またはインデックスと同様に、またはループを使用することができます。あなたは明示的にあなたがリストを望んでいると言う必要があります(上記のPHPイディオムは、文字列を扱うことを前提としていますが、配列を渡すと問題を引き起こす可能性があります)。

あなただけの最初の答えをしたい場合は、のいずれかを使用することができます。名前answer[]とはキーがgetlist()戻り[]を存在しない場合

answer = request.form.get('answer[]') 
answer = request.form['answer[]'] 

は、get()戻りNoneとインデックスは、例外が発生します。

関連する問題