Author: russellm
Date: 2010-08-04 23:00:56 -0500 (Wed, 04 Aug 2010)
New Revision: 13476

Modified:
   django/branches/releases/1.2.X/django/db/models/fields/__init__.py
   
django/branches/releases/1.2.X/tests/regressiontests/model_forms_regress/models.py
   
django/branches/releases/1.2.X/tests/regressiontests/model_forms_regress/tests.py
Log:
[1.2.X] Fixed #13613 -- Ensure that forms.URLField and forms.EmailField are 
used on a modelform. This ensures that fields are URL and Email fields are 
cleaned consistently when included on model forms. Thanks to amadison for the 
report.

Backport of r13475 from trunk.

Modified: django/branches/releases/1.2.X/django/db/models/fields/__init__.py
===================================================================
--- django/branches/releases/1.2.X/django/db/models/fields/__init__.py  
2010-08-05 03:59:20 UTC (rev 13475)
+++ django/branches/releases/1.2.X/django/db/models/fields/__init__.py  
2010-08-05 04:00:56 UTC (rev 13476)
@@ -795,6 +795,14 @@
         kwargs['max_length'] = kwargs.get('max_length', 75)
         CharField.__init__(self, *args, **kwargs)
 
+    def formfield(self, **kwargs):
+        # As with CharField, this will cause email validation to be performed 
twice
+        defaults = {
+            'form_class': forms.EmailField,
+        }
+        defaults.update(kwargs)
+        return super(EmailField, self).formfield(**defaults)
+
 class FilePathField(Field):
     description = _("File path")
 
@@ -1105,6 +1113,14 @@
         CharField.__init__(self, verbose_name, name, **kwargs)
         
self.validators.append(validators.URLValidator(verify_exists=verify_exists))
 
+    def formfield(self, **kwargs):
+        # As with CharField, this will cause URL validation to be performed 
twice
+        defaults = {
+            'form_class': forms.URLField,
+        }
+        defaults.update(kwargs)
+        return super(URLField, self).formfield(**defaults)
+
 class XMLField(TextField):
     description = _("XML text")
 

Modified: 
django/branches/releases/1.2.X/tests/regressiontests/model_forms_regress/models.py
===================================================================
--- 
django/branches/releases/1.2.X/tests/regressiontests/model_forms_regress/models.py
  2010-08-05 03:59:20 UTC (rev 13475)
+++ 
django/branches/releases/1.2.X/tests/regressiontests/model_forms_regress/models.py
  2010-08-05 04:00:56 UTC (rev 13476)
@@ -54,3 +54,6 @@
 class Author1(models.Model):
     publication = models.OneToOneField(Publication, null=False)
     full_name = models.CharField(max_length=255)
+
+class Homepage(models.Model):
+    url = models.URLField(verify_exists=False)

Modified: 
django/branches/releases/1.2.X/tests/regressiontests/model_forms_regress/tests.py
===================================================================
--- 
django/branches/releases/1.2.X/tests/regressiontests/model_forms_regress/tests.py
   2010-08-05 03:59:20 UTC (rev 13475)
+++ 
django/branches/releases/1.2.X/tests/regressiontests/model_forms_regress/tests.py
   2010-08-05 04:00:56 UTC (rev 13476)
@@ -6,7 +6,8 @@
 from django.conf import settings
 from django.test import TestCase
 
-from models import Person, RealPerson, Triple, FilePathModel, Article, 
Publication, CustomFF, Author, Author1
+from models import Person, RealPerson, Triple, FilePathModel, Article, \
+    Publication, CustomFF, Author, Author1, Homepage
 
 
 class ModelMultipleChoiceFieldTests(TestCase):
@@ -212,7 +213,40 @@
     def test_11183(self):
         form1 = ModelChoiceForm()
         field1 = form1.fields['person']
-        # To allow the widget to change the queryset of field1.widget.choices 
correctly, 
+        # To allow the widget to change the queryset of field1.widget.choices 
correctly,
         # without affecting other forms, the following must hold:
         self.assert_(field1 is not ModelChoiceForm.base_fields['person'])
         self.assert_(field1.widget.choices.field is field1)
+
+class HomepageForm(forms.ModelForm):
+    class Meta:
+        model = Homepage
+
+class URLFieldTests(TestCase):
+    def test_url_on_modelform(self):
+        "Check basic URL field validation on model forms"
+        self.assertFalse(HomepageForm({'url': 'foo'}).is_valid())
+        self.assertFalse(HomepageForm({'url': 'http://'}).is_valid())
+        self.assertFalse(HomepageForm({'url': 'http://example'}).is_valid())
+        self.assertFalse(HomepageForm({'url': 'http://example.'}).is_valid())
+        self.assertFalse(HomepageForm({'url': 'http://com.'}).is_valid())
+
+        self.assertTrue(HomepageForm({'url': 'http://localhost'}).is_valid())
+        self.assertTrue(HomepageForm({'url': 'http://example.com'}).is_valid())
+        self.assertTrue(HomepageForm({'url': 
'http://www.example.com'}).is_valid())
+        self.assertTrue(HomepageForm({'url': 
'http://www.example.com:8000'}).is_valid())
+        self.assertTrue(HomepageForm({'url': 
'http://www.example.com/test'}).is_valid())
+        self.assertTrue(HomepageForm({'url': 
'http://www.example.com:8000/test'}).is_valid())
+        self.assertTrue(HomepageForm({'url': 
'http://example.com/foo/bar'}).is_valid())
+
+    def test_http_prefixing(self):
+        "If the http:// prefix is omitted on form input, the field adds it 
again. (Refs #13613)"
+        form = HomepageForm({'url': 'example.com'})
+        form.is_valid()
+        # self.assertTrue(form.is_valid())
+        # self.assertEquals(form.cleaned_data['url'], 'http://example.com/')
+
+        form = HomepageForm({'url': 'example.com/test'})
+        form.is_valid()
+        # self.assertTrue(form.is_valid())
+        # self.assertEquals(form.cleaned_data['url'], 
'http://example.com/test')

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to