Formクラスにもバリデーションを定義することができるが、
Modelクラスにも定義することができる。
full_clean()
バリデーションを実施するにはfull_clean()を呼べばよい。
full_clean()では下記が呼ばれる。
clean_field() -> 各フィールドのvalidatorsに定義したものが呼ばれる
clean() -> フィールドに関連しない全体のチェック。cleanを定義していなければ何もしない。
validate_unique() -> フィールドに定義したunique制約をチェックする
validate_constraints() -> Meta.constraintsに定義したデータベース制約をチェックする
save()では呼ばれないのでその前で呼ぶ。
問題があった場合はValidationErrorをキャッチする。
"""インスタンスの保存処理""" try: sample = Sample() sample.full_clean() sample.save() except ValidationError as e: print(e) except DatabaseError as e: print(e)
"""モデルクラス""" def clean(self) -> None: """フィールドに関連づかないバリデーションエラー""" something_happen = True if something_happen: raise ValidationError("何らかのエラー!!")
save()で呼ぶにはオーバーライドする。
"""モデルクラス""" def save(self, force_insert, force_update, using, update_fields): """saveの前になにかさせる場合""" self.full_clean() return super().save(force_insert, force_update, using, update_fields)
is_valid()
そもそもFormクラスのis_valid()を呼ぶことでこいつが呼ばれる思想なのかもしれない。
Formのis_valid() -> full_clean() -> _post_clean() -> Modelのfull_clean()
この順番で呼ばれてくるようだ。