【Flask】複数のinputタグのname属性を同じにしてリストで取り出す
前回
は、ホームページに「テキストボックス」と「ボタン」だけを設置し、テキストを入力してボタンを押すと、入力テキスト内容が別ページに表示される簡単なWebアプリを作りました。
今回は前回のプログラムを一部変更し、複数のinputタグ要素のname属性パラメータを全て同じにした時の値の取得をやってみます。
formタグに適当に幾つかinputタグを設置します。これらのname属性を同じにすると、リスト形式で渡されるようです。
Flask側では、これらの値をFlaskのrequest
モジュールを使って取得しますが、request.form['name属性']
やrequest.form.get('name属性')
ではリストの先頭の値のみしか取得されないようです。
request.form.getlist('name属性')
を使うと全ての値がリストで取得できる。
目次
実行環境
ディレクトリ構成とファイルの中身
flask_sample/ ├── app.py │ └── templates ├── base.html ├── index.html └── result.html 1 directories, 4 files
base.html
htmlファイルのメタ情報部分のテンプレートファイル
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- タイトル --> <title>Flaskサンプル-{% block title %}{% endblock %}</title> </head> <!-- コンテンツ内容 --> <body> {% block content %} {% endblock %} </body> </html>
index.html
ホームページ。入力欄やボタンを設置。inputのname属性を全て「 item 」にした。
{% extends 'base.html' %} {% block title %}ホームページ{% endblock %} {% block content %} <form action="/result" method="POST"> <p>テキスト:<input type="text" name="item"></p> <p>数値:<input type="number" name="item"></p> <p> <input type="checkbox" name="item" value="1" checked="checked">松 <input type="checkbox" name="item" value="2">竹 <input type="checkbox" name="item" value="3">梅 </p> <p><input type="submit" value="検索"></p> </form> {% endblock %}
app.py
フラスコアプリ。
from flask import Flask, render_template, request app = Flask(__name__) # ホームページ @app.route('/') def index(): return render_template('index.html') # 入力値の表示ページ @app.route('/result', methods=['GET', 'POST']) def result(): # index.htmlのinputタグ内にあるname属性itemを取得し、textに格納した text = request.form.getlist('item') # もしPOSTメソッドならresult.htmlに値textと一緒に飛ばす if request.method == 'POST': return render_template('result.html', txt = text) # POSTメソッド以外なら、index.htmlに飛ばす else: return render_template('index.html') if __name__=='__main__': app.run(debug=True)
実行
$ python app.py
サーバが立ったらブラウザでlocalhostのポート5000番にアクセス。
ルートにアクセス。
入力してボタンで送信。
リストがそのまんま表示された。
ついでなので、次はfor文で一つずつ取り出してみる。
result.html書換
リストで取り出せるようなので、ついでにFlaskのテンプレートエンジンの使い方練習をします。
書換1)リストの表示をfor文で
表示する用のテンプレートファイルresult.html
を次のように書き換えました。
{% extends 'base.html' %} <!-- タイトル表示 --> {% block title %}入力の表示{% endblock %} <!-- コンテンツ内容の表示 --> {% block content %} {% for i in txt %} <ul><li>{{ i|e }}</li></ul> {% endfor %} {% endblock %}
入力後にボタンを押すと、
リストをulタグ
でリスト表示できた。
書換2)リストをインデックス指定で抽出
またresult.html
を書き換え、リストをインデックス指定で要素を取り出してみます。
{% extends 'base.html' %} <!-- タイトル表示 --> {% block title %}入力の表示{% endblock %} <!-- コンテンツ内容の表示 --> {% block content %} {{ txt[0] , txt[3] }} {% endblock %}
2つ取り出したらタプルになった。
おわりに
今回やったように複雑のinputタグのname属性を同じにすることはあるのか分からないが、request.form.getlist('name属性')
でリストで取得できることはわかった。
以上です。