0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

djangoのtemplateでformset.is_validがTrueでも、formset.errorsの結果が[{}, {}, {}]になる問題について

Posted at

はじめに

djnagoに関する非常にピンポイントでマニアックな投稿ですが、「え?そんな挙動するの?」と驚いた & 調べても解決策があまり出てこなかったので、自分の頭の整理と、誰かのためになればと共有します。

よりよい可決策があるかもしれないので、もし何か知っている方がいれば教えてください!

何が問題か?

こんな場合

  • djangoを使っている
  • djangoのformset, inline_formsetでフォームを作成している
  • formsetのvalidationでエラーが出た場合に、特別な処理をしたい(if分岐の条件に入れたい)

想定していた値

  • {{ formset.errors }} の値は [] (空のリスト)

実際の値

  • {{ formset.errors }} の値は [{}, {}, {}] (空の辞書が入ったリスト)

    空の辞書の数は、formsetの数に対応している
    image.png

ダメなパターン

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
  • is_boundがFalseの時は、formsetに値が入っていない
    formsetに値が入っていない状態で
    • is_valid は False

is_bound の値と、is_valid の値が 異なる場合、 Validation エラーがあると定義できる

参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?