Django form.is_valid()の結果が常にFalseとなってしまう現象と対策

ラジオボタン(RadioSelect)でform.is_validがTrueにならず、情報の取得ができない。

状況

forms.py

class FrmIsValidForm(forms.Form):
    ch = (
        ("ja", "日本"),
    )
    rdo = forms.ChoiceField(label = "ラジオボタン", widget=forms.RadioSelect(), required=False)

views.py

ch = (
    ("ja", "日本"),
    ("us", "アメリカ"),
    ("uk", "イギリス"),
    ("fr", "フランス"),
    ("de", "ドイツ"),
)

# form.is_valid失敗のパターン
if request.method == "POST":
    form = FrmIsValidForm(request.POST)
    if form.is_valid():
        rdo = form.cleaned_data.get("rdo")
        print("rdo:", rdo)
else:
    form = FrmIsValidForm()

form.fields["rdo"].choices = ch

表示された画面の「送信」ボタンを押下しても「form.is_valid()」がFalseのままとなってラジオボタンの情報が取得できません。

原因と解決策

解決方法として以下の箇所を修正します。

views.py(★箇所追加)

ch = (
    ("ja", "日本"),
    ("us", "アメリカ"),
    ("uk", "イギリス"),
    ("fr", "フランス"),
    ("de", "ドイツ"),
)

# form.is_valid成功のパターン
if request.method == "POST":
    form = FrmIsValidForm(request.POST)
★  form.fields["rdo"].choices = ch
    if form.is_valid():
        rdo = form.cleaned_data.get("rdo")
        print("rdo:", rdo)
else:
    form = FrmIsValidForm()
    form.fields["rdo"].choices = ch

原因としてラジオボタンの構成が「forms.py」と「view.py」で異なっており、これをそのまま使用していた為です。
解決策として「form.is_valid()」をする前に構成を合わせる必要があります。

ラジオボタンの各項目をDBから取得したデータに変更するなど、動的に変更する場合はよくあると思います。このような場合に陥ってしまいやすいです。

ラジオボタンだけでなく、チェックボックスやプルダウンなども同様の現象が発生する可能性がありますので注意してください。

コメント