瀏覽代碼

Fixed #20594 -- Add validation to models.SlugField.

Thanks carbonXT for the report.
Baptiste Mispelon 11 年之前
父節點
當前提交
dc9c359546
共有 4 個文件被更改,包括 9 次插入6 次删除
  1. 2 1
      django/db/models/fields/__init__.py
  2. 1 4
      django/forms/fields.py
  3. 1 0
      tests/validation/models.py
  4. 5 1
      tests/validation/tests.py

+ 2 - 1
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

+ 1 - 4
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):
 

+ 1 - 0
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()

+ 5 - 1
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):