投稿/コメントを表示します。

お世話になります。

動画2:26ごろから、clean_<fieldname>、cleanメソッドについて、確認したいことがございます。
お手数をおかけしますが、ご教示いただきたく、どうぞよろしくお願いいたします。

form.is_varid()メソッドで内部的に呼び出されるcleanメソッドについて

・cleanメソッドの場合、親クラス(superクラス)のcleanメソッドを呼び出します。
・clean_<fieldname> メソッドの時は、特定のフィールド属性を指定して、バリデーションをカスタマイズします。

この違いは、以下のような処理の流れがあるからだと思いました。
理解不足で申し訳ございませんが、誤った理解がないか確認したいです。

1.最初に親クラスのcleanメソッドを呼び出し、全フィールドのバリデーションをオーバーライド
2.clean_<fieldname> メソッドの記述がある場合
clean_<fieldname> メソッドで、特定のフィールド属性を検証する場合は、cleaned_data[key]もしくは、 cleanded_data.get()メソッド(keyErrorを発生させない)のいずれかでフィールドを指定して、バリデーションをカスタマイズ
3.clean()メソッドの記述がある場合は、最後に親クラスのcleanメソッドを呼び出してオーバーライド。
 カスタマイズした例外処理を記述する。

djangoドキュメント フォームとフィールドの検証を読んだのですが、混乱してしまいました。
「フィールドバリデーションのメソッドは clean() が呼ばれる際に実行されるので、フォームの errors 属性にもアクセスできるようになります。これは各フィールドのクリーニングによって発生した例外をすべて含みます。
Form.clean() をオーバーライドして発生させた例外は、特定のフィールドに結びつかない点に注意してください。
これらは特別な "フィールド" (__all__ と呼ばれます) に格納され、必要に応じて non_field_errors() メソッドを通じてアクセスできます。
特定のフィールドにエラーを紐付けて格納したい場合は、add_error() を呼び出す必要があります。」

自分の画像登録アプリで、forms.Formとforms.ModelFormで、特定のフィールドでバリデーション処理を行うコードを書きました。
そしてテンプレートで個別のフィールドに対しエラーを表示するようにしました。
(ファイルサイズ制限と、file_nameに"test"といれたらValidetionErrorを返す)
ViewはFormViewクラスを継承したクラスベースドビューにしました。

(添削依頼はありません)

forms.py
class CheckValidationForm(forms.Form):
    """clean処理を用いたフォーム作業"""

    file = forms.ImageField(label='登録ファイル')
    file_name = forms.CharField(label='ファイル名')

    def clean_file(self):
        """
        ファイル容量が500KBを超えていたらエラーを返す

        :param: file:バリデーションを実行された後に生成される辞書
            指定されたキーが存在しない場合はNoneを返すself.cleanded_data.get()メソッドにしてみた
        :return:エラーの場合はValidationErrorを返す:
                エラーがない場合はfileオブジェトクを返す
        """

        file = self.cleaned_data.get('file')

        if file and file.size > 500 * 1000:
            raise forms.ValidationError('ファイルサイズは500KB以下にしてください')
        return file


    def clean_file_name(self):
        """
        file_nameが"test"だったら、エラーを返す

        :param: file:バリデーションを実行された後に生成される辞書
            指定されたキーが存在しない場合はNoneを返すself.cleanded_data.get()メソッドにしてみた
        :return:エラーの場合はValidationErrorを返す:
                エラーがない場合はfileオブジェトクを返す
        """

        cleand_data = super().clean()
        file_name = cleand_data['file_name']
        if file_name == "test":
            raise forms.ValidationError('ファイル名にtestという名前は使用できません')
        return file_name

htmlファイル 選択したファイルサイズが500KB以上、file_nameが"test"の場合、それぞれエラー表示を出して停止
        <form action="" method="post" enctype="multipart/form-data">
            {% csrf_token %}

            {{ form.file.label }}:{{ form.file }}

            {% if form.file.errors %}
                <div style="color: red">  {{ form.file.errors.as_text }}</div>
            {% endif %}

            {{ form.file_name.label }}:{{ form.file_name }}

            {% if form.file_name.errors %}
                <div style="color: red">  {{ form.file_name.errors.as_text }}</div>
            {% endif %}

            <p><input type="submit" value="アップロード"></p>
        </form>

お手数をおかけしますが、どうぞよろしくお願いいたします。
2023/02/15 21:10