是否可以使用带参数的验证器?

san*_*rob 10 django

我找不到关于这个主题的任何相关答案.我想在Django中创建验证器,其中包含以下参数:

在forms.py文件中:

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

在validators.py文件中:

def validate_range_of_date(date_to_verify, min_date, max_date):
    ...
Run Code Online (Sandbox Code Playgroud)

我现在可以通过clean方法或自定义字段来完成它,但我认为通过验证器进行此操作会更好.可能吗?

提前致谢

Dun*_*kes 12

您可以尝试编写一个返回函数的函数.

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过调用此函数来创建您真正想要的验证器:

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

(感谢更正@ user2577922)

PS我没有测试过这个,但希望你能得到这个想法 - 编写一个函数,它将你想要的两个日期作为你的范围的边界,并返回一个函数来检查它传递的日期是在范围.

  • 我尝试了Duncan的答案(在models.py中)并使用它来工作:引发ValidationError("foo bar")而不是返回ValidationError("foo bar") (2认同)

ame*_*ara 7

我建议看一下django.core.validators,看看Django如何使用Regex验证器,并将其扩展为用于不同类型的字段.

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

    def __call__(self, value):
        pass  # Actual validation logic comes here
Run Code Online (Sandbox Code Playgroud)

只需将参数传递给验证器即可

validators=[MyValidator(params)]
Run Code Online (Sandbox Code Playgroud)

没有测试,但我没有看到任何理由不起作用.

编辑:

有机会测试它,它的工作原理.