21

モデルのclean()メソッドと基本的なフィールド検証に問題があります。これが私のモデルとclean()方法です。

class Trial(models.Model):

    trial_start = DurationField()
    movement_start = DurationField()
    trial_stop = DurationField()


    def clean(self):
        from django.core.exceptions import ValidationError
        if not (self.movement_start >= self.trial_start):
            raise ValidationError('movement start must be >= trial start')
        if not (self.trial_stop >= self.movement_start):
            raise ValidationError('trial stop must be >= movement start')
        if not (self.trial_stop > self.trial_start):
            raise ValidationError('trial stop must be > trial start')

私のclean()メソッドは、特定の値が正しい範囲内にあるかどうかをチェックします。ユーザーがフィールドへの入力を忘れた場合 (例: movement_start)、エラーが発生します。

can't compare datetime.timedelta to NoneType

元の関数がその欠落しているエントリをキャッチする必要があるため、このエラーが発生することに驚いていますclean()(結局のところ、これmovement_startは必須フィールドです)。では、欠損値の基本的なチェックと、値が特定の範囲内にあるかどうかのカスタム チェックを行うにはどうすればよいでしょうか。これはモデルのclean()メソッドで実行できますか、または使用する必要がありますFormsか?

より明確にするための EDIT1:とtrial_startすべて必須フィールドです。最初に 3 つのフィールドすべてが入力されていることを確認し、次に値が特定の範囲内にあるかどうかを確認するメソッドを作成する必要があります。movement_starttrial_stopclean()

たとえば、次のコードはtrial_start空である可能性があるため、機能しません。各フィールドの存在を確認する必要がないようにしたいのですが、django がそれを行う必要があります。

class TrialForm(ModelForm):

    class Meta:
        model = Trial

    def clean_movement_start(self):
        movement_start = self.cleaned_data["movement_start"]
        trial_start = self.cleaned_data["trial_start"]
        if not (movement_start >= trial_start):
            raise forms.ValidationError('movement start must be >= trial start')
        return self.cleaned_data["movement_start"] 

EDIT2 このチェックをモデルのメソッドに追加したかった理由clean()は、Python シェルで作成されたオブジェクトが正しい値を自動的にチェックするためです。ビューにはフォームで問題ありませんが、シェルにも値チェックが必要です。

4

4 に答える 4

11

私はそれが行く方法だと思います:

class TrialForm(ModelForm):

    class Meta:
        model = Trial

    def clean(self):
        data = self.cleaned_data
        if not ('movement_start' in data.keys() and 'trial_start' in data.keys()  and 'trial_stop' in data.keys()):
            raise forms.ValidationError("Please fill out missing fields.")

        trial_start = data['trial_start']
        movement_start = data['movement_start']
        trial_stop = data['trial_stop']

        if not (movement_start >= trial_start):
            raise forms.ValidationError('movement start must be >= trial start')

        if not (trial_stop >= movement_start):
            raise forms.ValidationError('trial stop must be >= movement start')

        if not (trial_stop > trial_start):
            raise forms.ValidationError('trial stop must be > trial start')

        return data

編集このアプローチの欠点は、フォームからオブジェクトを作成した場合にのみ値のチェックが機能することです。Python シェルで作成されたオブジェクトはチェックされません。

于 2012-09-05T10:28:38.617 に答える