FlaskフレームワークとWTFormsライブラリを利用したウェブアプリケーションの開発において、「複数選択肢フィールド(Multiple Choices)」の実装は非常に便利で、ユーザーから複数の選択肢を選ばせる必要がある場面で役立ちます。この完全かつ包括的な記事では、WTFormsで複数選択肢を扱う方法について、基本的な構成から詳細な実装方法までを解説します。
1. WTFormsとは?
WTFormsは、FlaskをはじめとするPythonのウェブアプリケーションフレームワークでフォームを簡単に管理するためのライブラリです。これにより、HTMLフォームの作成、バリデーション、データの処理が非常に簡単になります。
WTFormsには、様々なフィールドタイプが用意されており、その中で「Multiple Choice(複数選択)」フィールドもその一つです。複数選択肢をユーザーに提示し、複数のオプションを選んでもらう場合に使います。具体的には、SelectMultipleFieldというフィールドタイプがこれに対応しています。
2. 複数選択肢フィールドの基本構成
FlaskでWTFormsを使う場合、まず最初にフォームを作成する必要があります。以下は、基本的なフォームクラスの例です。
pythonfrom flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import SelectMultipleField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
class MyForm(FlaskForm):
options = SelectMultipleField('選択肢', choices=[('1', 'オプション1'), ('2', 'オプション2'), ('3', 'オプション3')], validators=[DataRequired()])
@app.route('/', methods=['GET', 'POST'])
def index():
form = MyForm()
if form.validate_on_submit():
selected_options = form.options.data
return f'選択したオプション: {selected_options}'
return render_template('index.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
説明:
-
SelectMultipleFieldを使って、ユーザーが複数のオプションを選べるようにします。 -
choicesパラメータには、選択肢のリストをタプル形式で渡します。タプルの最初の値がフォームに送信される値、2番目がユーザーに表示されるラベルです。 -
validatorsには、フォームが提出される前に選択肢が必須であることをチェックするためのDataRequired()バリデーターを指定しています。
3. 複数選択肢フィールドのHTMLレンダリング
次に、Flaskテンプレート(index.html)でフォームをどのように表示するかについて見ていきましょう。
htmlhtml>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WTForms 複数選択肢フォームtitle>
head>
<body>
<h1>複数選択肢フォームh1>
<form method="POST">
{{ form.hidden_tag() }}
<div>
{{ form.options.label }}
{{ form.options() }}
div>
<div>
<button type="submit">送信button>
div>
form>
body>
html>
説明:
-
form.options()で、複数選択肢のドロップダウンリスト(チェックボックス群)が表示されます。 -
{{ form.hidden_tag() }}は、CSRF対策として必要な隠しフィールドを自動的に挿入します。
4. 複数選択肢の処理
ユーザーがフォームを送信すると、選択したオプションはリストとしてサーバーに送信されます。Flaskでは、form.options.dataでそのデータを取得することができます。
上記の例では、選択されたオプションがリスト(例:['1', '2'])として取得され、その内容をレスポンスとして表示しています。このリストを使って、選択されたオプションに基づいた処理を行うことができます。
5. 複数選択肢フィールドのカスタマイズ
SelectMultipleFieldには、選択肢の順番を変更したり、動的に選択肢を生成したりすることができます。例えば、データベースから選択肢を取得して動的にフォームを生成することも可能です。
動的な選択肢の例:
pythonclass MyForm(FlaskForm):
options = SelectMultipleField('選択肢', coerce=int)
@app.route('/', methods=['GET', 'POST'])
def index():
form = MyForm()
form.options.choices = [(1, 'オプション1'), (2, 'オプション2'), (3, 'オプション3')]
if form.validate_on_submit():
selected_options = form.options.data
return f'選択したオプション: {selected_options}'
return render_template('index.html', form=form)
このように、choicesをリストで動的に設定することもできます。
6. その他のカスタマイズ
-
選択肢の表示形式の変更:
SelectMultipleFieldの選択肢を表示する際に、HTMLやCSSを使って、レイアウトやデザインを変更することが可能です。例えば、チェックボックスのラベルにアイコンを追加したり、選択肢をグループ化したりできます。 -
選択肢の初期値を設定:
特定の選択肢を最初から選択させる場合は、form.options.dataを利用して初期値を設定できます。
7. 最後に
WTFormsのSelectMultipleFieldを利用すると、複数選択肢のフォームを簡単に作成でき、Flaskと組み合わせることで強力なWebアプリケーションを構築することができます。フォームのバリデーションや動的な選択肢の生成など、WTFormsは非常に多機能であり、柔軟なフォーム処理を提供してくれます。
この方法を活用すれば、ユーザーインターフェースをより直感的で使いやすくすることができ、さらに強力なWebアプリケーションを作り上げることができるでしょう。

