Django フォームのフィールドを動的に増やす

Djangoでフォームを作成する時、forms.pyにフィールド内容を記載していきますが、状況によって表示させるフィールドの数を増減させたい時があると思います。

私の場合はDBに登録されたデータ数分のフィールドを表示する必要がありました。

Django 動的にフォームのフィールドを作成

次のようなアプリを作成例として説明します。

確定ボタン押下でフォーム数に入力されている数値分のテキストボックスが表示されます。

動的フォームのフィールド作成方法

forms.py:定義のみで中身は特に記述不要です。

# 動的フォーム
class FrmDynamicForm(forms.Form):
    pass

html:viewから渡されるフォームを記載するだけです。

{{ dym_form }}

views.py:変数「cnt」に入力されたフォーム数が格納されています。(取得方法の説明は省略)

dym_form = FrmDynamicForm(request.POST)
for val in range(0, cnt):
    dym_form.fields[val] = forms.CharField(label="値" + str(val+1))

動的フォームのフィールド情報取得方法

動的に作成したフィールドに入力された情報の取得方法です。

for val in range(0, cnt):
    if str(val) in request.POST:
        request.POST[str(val)]
# 3
# 5
# 9

二行目のif文は、取得要素が含まれているかどうかを見ており、上記例ではループ回数とフォーム数が一致しない状況が発生した場合、判定で弾かれてエラーとなるのを防いでいます。

コメント