diff --git a/django/core/validators.py b/django/core/validators.py index 7e6f426278..b5901cbc3b 100644 --- a/django/core/validators.py +++ b/django/core/validators.py @@ -344,7 +344,30 @@ class MatchesRegularExpression: def __call__(self, field_data, all_data): if not self.regexp.match(field_data): - raise validators.ValidationError(self.error_message) + raise ValidationError(self.error_message) + +class AnyValidator: + """ + This validator tries all given validators. If any one of them succeeds, + validation passes. If none of them succeeds, the given message is thrown + as a validation error. The message is rather unspecific, so it's best to + specify one on instantiation. + """ + def __init__(self, validator_list=[], error_message="This field is invalid."): + self.validator_list = validator_list + self.error_message = error_message + for v in validator_list: + if hasattr(v, 'always_test'): + self.always_test = True + + def __call__(self, field_data, all_data): + for v in self.validator_list: + try: + v(field_data, all_data) + return + except ValidationError, e: + pass + raise ValidationError(self.error_message) class URLMimeTypeCheck: "Checks that the provided URL points to a document with a listed mime type"