15

この件に関して適切な回答が見つかりません。次のようないくつかのパラメーターを使用して、Django でバリデーターを作成したいと思います。

forms.py ファイルで:

class DateForm(forms.Form):
    forms.DateField(
        validators=[validate_range_of_date(value,"01/06/2012","31/03/2013")]
        )

validators.py ファイルで:

def validate_range_of_date(date_to_verify, min_date, max_date):
    ...

私は今、クリーンメソッドまたはカスタムフィールドを介してそれを行うことができますが、バリデーターを介して行う方が良いと思います. 出来ますか?

前もって感謝します

4

5 に答える 5

19

関数を返す関数を書いてみてください。

def date_range_validator(min_date, max_date):
    def innerfn(date_to_test):
        if not (min_date <= date_to_test <= max_date):
            raise ValidationError(
                'Inappropriate date: %s is not between %s and %s' %
                (date_to_test, min_date, max_date)
                )
    return innerfn

次に、この関数を呼び出して、実際に必要なバリデーターを作成できます。

class DateForm(forms.Form):
    forms.DateField(
        validators=[
            date_range_validator(
                datetime.date(2012, 06, 01), datetime.date(2013, 03, 31)
                )
            ]
        )

(修正@ user2577922に感謝)

PS私はこれをテストしていませんが、うまくいけばアイデアが得られます.2つの日付を範囲の境界として取り、渡された日付が範囲。

于 2012-08-03T21:38:20.037 に答える
14

Django.core.validatorsを見て、Django が正規表現バリデーターをどのように使用し、それを拡張してさまざまなタイプのフィールドに使用するかを確認することをお勧めします。

class MyValidator (object):
    def __init__(self, params):
        pass  #  Init the instance variables here

    def __call__(self, value):
        pass  # Actual validation logic comes here

パラメータをバリデータに渡すだけです

validators=[MyValidator(params)]

テストしていませんが、動作しない理由はわかりません。

編集:

それをテストする機会があり、それは機能します。

于 2015-02-16T13:41:51.220 に答える
4

amertkara のソリューションに基づいて、ユーザーの電子メール アドレスをフォームに渡し、ユーザーの入力を自分の電子メール アドレスに対して検証します。

# form
class new_user_form(forms.Form):
    def __init__(self, *args, **kwargs):
        own_mail = kwargs.pop('own_mail')
        super(new_user_form, self).__init__(*args, **kwargs)
        self.fields['email'] = forms.EmailField(
            label='',
            required=True,
            validators = [ not_own_mail(own_mail) ]
        )

# validator
class not_own_mail(object):
    def __init__(self, email):
        self.email = email

    def __call__(self, value):
       if value == self.email:
            raise ValidationError('It must be a different email address.')
       else:
           return value
于 2015-03-30T20:18:58.543 に答える
2

ラムダ式を使用してみることができます(自分で試したことがないので、うまくいくかどうかはわかりません):

forms.DateField(validators=[lambda value: validate_range_of_data(value, "01/06/2012", "31/03/2012")])

もちろん、それがフィールドの clean メソッドで検証するよりも「良い」かどうかを自問する必要があります。

于 2012-08-03T16:40:46.990 に答える