質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4257閲覧

flask requestでselectの値を取得

goldthisplay

総合スコア14

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/28 18:41

前提・実現したいこと

Python+Flaskでwebアプリを作成しています。jqueryのプラグインを使って、フォームに入力されたテキストをvalueに持つ新たなoptionが生成されるようにしています。送信ボタンを押すとPOSTメソッドを使ってrequest.form.getlist()でselectタグ中のすべてのoptionのvalueを取得するようにしたいです。

発生している問題・エラーメッセージ

HTMLのselectでname="tags"としてもrequest.form.getlist('tags')が一つの値しか返しません。複数の値を入力すると空のリストを返します。

該当のソースコード

HTML

1<form class="form-inline" action="{{ url_for('edit', pk=images.id) }}" method="post"> 2 <div class="form-group"> 3 <select multiple data-role="tagsinput" name="tags"> 4 {% for tag in tags %} 5 <option value="{{tag}}">{{tag}}</option> 6 {% endfor %} 7 </select> 8 </div> 9 <button class="btn btn-primary" type="submit">保存</button> 10</form>

Python

1@app.route('/edit/<pk>', methods=['GET', 'POST']) 2def edit(pk): 3 con = get_db() 4 if request.method == 'POST': 5 tags = request.form.getlist('tags') 6 models.insert_tags(con, tags) 7 models.insert_tag_map(con, int(pk), tags) 8 list_of_year = models.get_existing_year(con) 9 existing_month_number = {} 10 for year in list_of_year: 11 existing_month_number[year] = models.get_existing_month_number(con, year) 12 images = models.select(con, 'images', int(pk)) 13 tags = models.get_tags(con, int(pk)) 14 return render_template('edit.html', list_of_year=list_of_year, existing_month_number=existing_month_number, 15 images=images, tags=tags)

補足情報(FW/ツールのバージョンなど)

Python 3.7.0
Flask 1.0.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

タグ入力のjqueryプラグインが適用できる要素がselectかinputなのですが、inputの方を利用することで実現したいUIは出来上がったので解決ということにします。inputを使うことを避けていたのはjinjaのfor文がHTMLの属性値には利用できないと勝手に思い込んでいたためです。つまり、

HTML

1<select multiple data-role="tagsinput" name="tags"> 2 {% for tag in tags %} 3 <option value="{{tag}}">{{tag}}</option> 4 {% endfor %} 5</select>

は可能で

HTML

1<input type="text" name="tags" data-role="tagsinput" value="{% for tag in tags %}{{tag}}{% if not loop.last %},{% endif %}{% endfor %}">

は不可能だと勝手に思い込んでいました。inputを使えばrequest.form.get()で正常に値が取得できるので、split(',')でリスト化してDBに挿入することができました。

投稿2018/10/29 16:20

編集2018/10/29 16:29
goldthisplay

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

selectタグ中のすべてのoptionのvalueを取得する

この情報をrequestから得るのは無理があるような気がします。
(POSTメソッドはname=valueで値を渡すものなので、情報源がない)

selectの選択肢はあらかじめサーバ側で構築して渡すものなので、同じ情報から再現するのが筋だと思いますけど……。

質問の意図を誤解していたらスミマセン。

投稿2018/10/29 11:03

morinatsu

総合スコア395

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

goldthisplay

2018/10/29 12:41

回答ありがとうございます。詳しい状況としては、最初ページがレンダリングされた時はselect内にoptionは一つもなく、ユーザーがoptionを追加してpostするとrequest.form.getlist()で1つの値は取得できます。ただ、複数のoptionを追加すると1つも値が取得できません。1つは取得できているので惜しい感じはしているのですが、やはり難しいでしょうか...。
goldthisplay

2018/10/29 16:26

結局selectから値を取得することはできませんでしたが、別の形で問題は解決しました。回答していただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問