6

私は Django を初めて使用し、フォーム処理中の検証手順に関して多少混乱しています。すべてのフォーム フィールド タイプ (私の場合は ModelForm) がデフォルトで必須であることは承知しています。フォームの clean メソッドを呼び出さに必須のフォーム フィールドが空白のままになっている場合、Django は VaidationError を発生させると想定しました。

clean()これが、次のメソッドでデータが設定されているかどうかを確認しなかった理由です。

def clean(self):
    date =  self.cleaned_data.get('date')
    time_start = self.cleaned_data.get('time_start')
    time_end = self.cleaned_data.get('time_end')
    user_type = self.cleaned_data.get('user_type')

    if Event.objects.filter(user_type=user_type, date=date, 
                            time_start__lt=time_start, 
                            time_end__gt=time_start).exclude(pk=self.instance.pk).count():
        raise forms.ValidationError("Overlapping with another event.")

すべてのフィールドを空白のままフォームを送信すると、

ValueError: None をクエリ値として使用できません。

clean()メソッドを削除するValidationErrorsと、必要なフィールドに入力しないと予想される結果が得られます。これは、clean()メソッドがまだ残っている場合に予想されることです。

何がこれを引き起こす可能性がありますか?Django がclean を呼び出すに必要な値をチェックしないとしたら、私は驚くでしょう。

4

1 に答える 1

5

フォームのcleanメソッドを呼び出す前にフィールドの検証が実行されるため、これは奇妙です。さらに、フィールドから発生したエラーは に格納されform.my_field.errors、フォームの clean メソッドから返されたエラーは に蓄積されform.non_field_errorsます。

以下は、フォームで実行される検証の順序です。

full_clean()
    |
Field clean() [field's built-in clean method]
    |
Form clean_*() [custom validation method for field]
    |
Form clean() [form's clean method]
    |
cleaned_data/errors
于 2012-09-16T19:09:18.857 に答える