Author: julien
Date: 2011-11-06 23:41:24 -0800 (Sun, 06 Nov 2011)
New Revision: 17076

Modified:
   django/trunk/django/forms/fields.py
   django/trunk/tests/regressiontests/forms/tests/fields.py
Log:
Fixed #17125 -- Made it possible to change a `RegexField`'s regular expression 
validator after it has been initialized. Thanks to Claude Paroz for the report 
and patch.

Modified: django/trunk/django/forms/fields.py
===================================================================
--- django/trunk/django/forms/fields.py 2011-11-07 01:09:13 UTC (rev 17075)
+++ django/trunk/django/forms/fields.py 2011-11-07 07:41:24 UTC (rev 17076)
@@ -442,11 +442,22 @@
             error_messages['invalid'] = error_message
             kwargs['error_messages'] = error_messages
         super(RegexField, self).__init__(max_length, min_length, *args, 
**kwargs)
+        self._set_regex(regex)
+
+    def _get_regex(self):
+        return self._regex
+
+    def _set_regex(self, regex):
         if isinstance(regex, basestring):
             regex = re.compile(regex)
-        self.regex = regex
-        self.validators.append(validators.RegexValidator(regex=regex))
+        self._regex = regex
+        if hasattr(self, '_regex_validator') and self._regex_validator in 
self.validators:
+            self.validators.remove(self._regex_validator)
+        self._regex_validator = validators.RegexValidator(regex=regex)
+        self.validators.append(self._regex_validator)
 
+    regex = property(_get_regex, _set_regex)
+
 class EmailField(CharField):
     default_error_messages = {
         'invalid': _(u'Enter a valid e-mail address.'),

Modified: django/trunk/tests/regressiontests/forms/tests/fields.py
===================================================================
--- django/trunk/tests/regressiontests/forms/tests/fields.py    2011-11-07 
01:09:13 UTC (rev 17075)
+++ django/trunk/tests/regressiontests/forms/tests/fields.py    2011-11-07 
07:41:24 UTC (rev 17076)
@@ -493,6 +493,12 @@
         self.assertRaisesMessage(ValidationError, "[u'Ensure this value has at 
most 10 characters (it has 11).']", f.clean, '12345678901')
         self.assertRaisesMessage(ValidationError, "[u'Enter a valid value.']", 
f.clean, '12345a')
 
+    def test_change_regex_after_init(self):
+        f = RegexField('^[a-z]+$')
+        f.regex = '^\d+$'
+        self.assertEqual(u'1234', f.clean('1234'))
+        self.assertRaisesMessage(ValidationError, "[u'Enter a valid value.']", 
f.clean, 'abcd')
+
     # EmailField 
##################################################################
 
     def test_emailfield_1(self):

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

Reply via email to