はじめに
djnagoに関する非常にピンポイントでマニアックな投稿ですが、「え?そんな挙動するの?」と驚いた & 調べても解決策があまり出てこなかったので、自分の頭の整理と、誰かのためになればと共有します。
よりよい可決策があるかもしれないので、もし何か知っている方がいれば教えてください!
何が問題か?
こんな場合
- djangoを使っている
- djangoのformset, inline_formsetでフォームを作成している
- formsetのvalidationでエラーが出た場合に、特別な処理をしたい(if分岐の条件に入れたい)
想定していた値
-
{{ formset.errors }}
の値は[]
(空のリスト)
実際の値
ダメなパターン
template.html
{% if formset.errors %}
# 任意の処理
{% endif %}
ダメな理由
- is_validがTrueでも、リストは空でないため(上記のif条件の結果はTrueになり、フォームの中身に問題はないのに)エラー時の処理が実行される
解決策
- is_boundと組み合わせる。
template.html
{% if formset.is_bound!=formset.errors %}
# 任意の処理
{% endif %}
解決できた理由
-
is_bound
がTrueの時は、formsetに値が入っている
formsetに値が入っている状態で- validationを通った場合(エラーがない場合)、
is_valid
は True - validationではじかれた場合(エラーがある場合)、
is_valid
は False
- validationを通った場合(エラーがない場合)、
-
is_bound
がFalseの時は、formsetに値が入っていない
formsetに値が入っていない状態で-
is_valid
は False
-
⇒ is_bound
の値と、is_valid
の値が 異なる場合、 Validation エラーがあると定義できる