ビジネス ロジックに関連するすべての検証をフォームに残すのではなく、モデルに移行しようとしています。しかし、ここで難しい状況が発生したので、SO コミュニティに相談したいと思います。
私の SignupForm (モデル フォーム) では、次のフィールド固有の検証を行って、入力メールがまだ存在しないことを確認しています。
def clean_email(self):
email = self.cleaned_data['email']
if ExtendedUser.objects.filter(email=email).exists():
raise ValidationError('This email address already exists.')
return email
公式ドキュメントによると、この検証をモデルに移すとしたらclean()
、対応するモデルのExtendedUser
. しかし、ドキュメントには次のことも記載されています。
Model.clean() によって発生した ValidationError 例外はすべて、特定のフィールドではなくモデル全体に関連付けられているエラーに使用される特別なキー エラー ディクショナリ キー NON_FIELD_ERRORS に格納されます。
つまり、 ではclean()
、それから発生したエラーを特定のフィールドに関連付けることができません。モデルがフォームに似たものを提供するかどうか疑問に思っていましたclean_<fieldname>()
。そうでない場合、この検証ロジックをどこに配置しますか?またその理由は?