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.