From dc9c359546580d40df209816cef244b78dcf7435 Mon Sep 17 00:00:00 2001 From: Baptiste Mispelon Date: Thu, 13 Jun 2013 18:37:08 +0200 Subject: [PATCH] Fixed #20594 -- Add validation to models.SlugField. Thanks carbonXT for the report. --- django/db/models/fields/__init__.py | 3 ++- django/forms/fields.py | 5 +---- tests/validation/models.py | 1 + tests/validation/tests.py | 6 +++++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 7d01391d4f..cf81a27997 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -1211,6 +1211,7 @@ class PositiveSmallIntegerField(IntegerField): return super(PositiveSmallIntegerField, self).formfield(**defaults) class SlugField(CharField): + default_validators = [validators.validate_slug] description = _("Slug (up to %(max_length)s)") def __init__(self, *args, **kwargs): @@ -1320,12 +1321,12 @@ class TimeField(Field): return super(TimeField, self).formfield(**defaults) class URLField(CharField): + default_validators = [validators.URLValidator()] description = _("URL") def __init__(self, verbose_name=None, name=None, **kwargs): kwargs['max_length'] = kwargs.get('max_length', 200) CharField.__init__(self, verbose_name, name, **kwargs) - self.validators.append(validators.URLValidator()) def formfield(self, **kwargs): # As with CharField, this will cause URL validation to be performed diff --git a/django/forms/fields.py b/django/forms/fields.py index ac68b9f1fc..420690704f 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -638,10 +638,7 @@ class URLField(CharField): default_error_messages = { 'invalid': _('Enter a valid URL.'), } - - def __init__(self, max_length=None, min_length=None, *args, **kwargs): - super(URLField, self).__init__(max_length, min_length, *args, **kwargs) - self.validators.append(validators.URLValidator()) + default_validators = [validators.URLValidator()] def to_python(self, value): diff --git a/tests/validation/models.py b/tests/validation/models.py index e95a1e0744..958740dd2d 100644 --- a/tests/validation/models.py +++ b/tests/validation/models.py @@ -19,6 +19,7 @@ class ModelToValidate(models.Model): email = models.EmailField(blank=True) url = models.URLField(blank=True) f_with_custom_validator = models.IntegerField(blank=True, null=True, validators=[validate_answer_to_universe]) + slug = models.SlugField(blank=True) def clean(self): super(ModelToValidate, self).clean() diff --git a/tests/validation/tests.py b/tests/validation/tests.py index 9ddf796c2b..c8b679541a 100644 --- a/tests/validation/tests.py +++ b/tests/validation/tests.py @@ -53,7 +53,11 @@ class BaseModelValidationTests(ValidationTestCase): def test_text_greater_that_charfields_max_length_raises_erros(self): mtv = ModelToValidate(number=10, name='Some Name'*100) - self.assertFailsValidation(mtv.full_clean, ['name',]) + self.assertFailsValidation(mtv.full_clean, ['name']) + + def test_malformed_slug_raises_error(self): + mtv = ModelToValidate(number=10, name='Some Name', slug='##invalid##') + self.assertFailsValidation(mtv.full_clean, ['slug']) class ArticleForm(forms.ModelForm):