diff --git a/django/forms/fields.py b/django/forms/fields.py
index 113a5aa..e12936c 100644
--- a/django/forms/fields.py
+++ b/django/forms/fields.py
@@ -40,6 +40,64 @@ __all__ = (
 )
 
 
+class ValidatorAttribute(object):
+    """
+    A descriptor used to dynamically update a field's validators based on a
+    single value.
+
+    .. attribute:: create_func
+
+        A function used to create a validator. It should take two arguments,
+        the object instance and a value.
+
+        When a value is set to this descriptor, this function is executed and
+        the validator it returns (if any) is added to the field's
+        :attr:`~Field.validators` list.
+
+        If this descriptor had previously set a validator, it will be removed
+        from the field's ``validators`` list.
+
+    .. attribute:: clean_func
+
+        An optional function which can modify the incoming value before setting
+        it. The function should take the same two arguments as
+        :attr:`create_func`.
+    """
+
+    def __init__(self, create_func, clean_func=None):
+        """
+        :param create_func: A function that creates a validator, sets
+            :attr:`create_func`.
+        :param clean_func: An optional function which can be used to clean the
+            incoming  value. Sets :attr:`clean_func`.
+        """
+        self.create_func = create_func
+        self.clean_func = clean_func
+        self.value = None
+        self.validator = None
+
+    def __get__(self, obj, obj_type):
+        return self.value
+
+    def __set__(self, obj, value):
+        if self.clean_func:
+            value = self.clean_func(obj, value)
+        self.value = value
+        if value is None:
+            new_validator = None
+        else:
+            new_validator = self.create_func(obj, value)
+        if new_validator is self.validator:
+            return
+        if self.validator:
+            try:
+                obj.validators.remove(self.validator)
+            except ValueError:
+                pass
+        if new_validator:
+            obj.validators.append(new_validator)
+        self.validator = new_validator
+
 class Field(object):
     widget = TextInput # Default widget to use when rendering this type of Field.
     hidden_widget = HiddenInput # Default widget to use when rendering this as "hidden".
@@ -180,12 +238,16 @@ class Field(object):
 
 class CharField(Field):
     def __init__(self, max_length=None, min_length=None, *args, **kwargs):
-        self.max_length, self.min_length = max_length, min_length
         super(CharField, self).__init__(*args, **kwargs)
-        if min_length is not None:
-            self.validators.append(validators.MinLengthValidator(min_length))
-        if max_length is not None:
-            self.validators.append(validators.MaxLengthValidator(max_length))
+        self.max_length, self.min_length = max_length, min_length
+
+    max_length = ValidatorAttribute(
+        create_func=lambda self, val: validators.MaxLengthValidator(val)
+    )
+
+    min_length = ValidatorAttribute(
+        create_func=lambda self, val: validators.MinLengthValidator(val)
+    )
 
     def to_python(self, value):
         "Returns a Unicode object."
@@ -206,13 +268,16 @@ class IntegerField(Field):
     }
 
     def __init__(self, max_value=None, min_value=None, *args, **kwargs):
-        self.max_value, self.min_value = max_value, min_value
         super(IntegerField, self).__init__(*args, **kwargs)
+        self.max_value, self.min_value = max_value, min_value
+
+    max_value = ValidatorAttribute(
+        create_func=lambda self, val: validators.MaxValueValidator(val)
+    )
 
-        if max_value is not None:
-            self.validators.append(validators.MaxValueValidator(max_value))
-        if min_value is not None:
-            self.validators.append(validators.MinValueValidator(min_value))
+    min_value = ValidatorAttribute(
+        create_func=lambda self, val: validators.MinValueValidator(val)
+    )
 
     def to_python(self, value):
         """
@@ -261,15 +326,19 @@ class DecimalField(Field):
         'max_whole_digits': _('Ensure that there are no more than %s digits before the decimal point.')
     }
 
-    def __init__(self, max_value=None, min_value=None, max_digits=None, decimal_places=None, *args, **kwargs):
+    def __init__(self, max_value=None, min_value=None, max_digits=None,
+                 decimal_places=None, *args, **kwargs):
+        super(DecimalField, self).__init__(*args, **kwargs)
         self.max_value, self.min_value = max_value, min_value
         self.max_digits, self.decimal_places = max_digits, decimal_places
-        Field.__init__(self, *args, **kwargs)
 
-        if max_value is not None:
-            self.validators.append(validators.MaxValueValidator(max_value))
-        if min_value is not None:
-            self.validators.append(validators.MinValueValidator(min_value))
+    max_value = ValidatorAttribute(
+        create_func=lambda self, val: validators.MaxValueValidator(val)
+    )
+
+    min_value = ValidatorAttribute(
+        create_func=lambda self, val: validators.MinValueValidator(val)
+    )
 
     def to_python(self, value):
         """
@@ -439,10 +508,17 @@ class RegexField(CharField):
             error_messages['invalid'] = error_message
             kwargs['error_messages'] = error_messages
         super(RegexField, self).__init__(max_length, min_length, *args, **kwargs)
+        self.regex = regex
+
+    def clean_regex_value(self, regex):
         if isinstance(regex, basestring):
             regex = re.compile(regex)
-        self.regex = regex
-        self.validators.append(validators.RegexValidator(regex=regex))
+        return regex
+
+    regex = ValidatorAttribute(
+        create_func=lambda obj, value: validators.RegexValidator(value),
+        clean_func=clean_regex_value
+    )
 
 class EmailField(CharField):
     default_error_messages = {
diff --git a/tests/regressiontests/forms/tests/fields.py b/tests/regressiontests/forms/tests/fields.py
index ad8d1d9..17da030 100644
--- a/tests/regressiontests/forms/tests/fields.py
+++ b/tests/regressiontests/forms/tests/fields.py
@@ -109,6 +109,23 @@ class FieldsTests(TestCase):
         self.assertEqual(f.max_length, None)
         self.assertEqual(f.min_length, 10)
 
+    def test_charfield_validator_attributes(self):
+        f = CharField(min_length=2, max_length=4)
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value has at least 2 characters (it has 1).']", f.clean, '1')
+        self.assertEqual(u'123', f.clean('123'))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value has at most 4 characters (it has 5).']", f.clean, '12345')
+
+        f.min_length = 6
+        f.max_length = 8
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value has at least 6 characters (it has 3).']", f.clean, '123')
+        self.assertEqual(u'1234567', f.clean('1234567'))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value has at most 8 characters (it has 9).']", f.clean, '123456789')
+
+        f.min_length = None
+        f.max_length = None
+        self.assertEqual(u'1', f.clean('1'))
+        self.assertEqual(u'123456789', f.clean('123456789'))
+
     # IntegerField ################################################################
 
     def test_integerfield_1(self):
@@ -180,6 +197,23 @@ class FieldsTests(TestCase):
         self.assertEqual(f.max_value, 20)
         self.assertEqual(f.min_value, 10)
 
+    def test_integerfield_validator_attributes(self):
+        f = IntegerField(min_value=2, max_value=4)
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is greater than or equal to 2.']", f.clean, 1)
+        self.assertEqual(3, f.clean(3))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is less than or equal to 4.']", f.clean, 5)
+
+        f.min_value = 6
+        f.max_value = 8
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is greater than or equal to 6.']", f.clean, 3)
+        self.assertEqual(7, f.clean(7))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is less than or equal to 8.']", f.clean, 9)
+
+        f.min_value = None
+        f.max_value = None
+        self.assertEqual(1, f.clean(1))
+        self.assertEqual(9, f.clean(9))
+
     # FloatField ##################################################################
 
     def test_floatfield_1(self):
@@ -217,6 +251,23 @@ class FieldsTests(TestCase):
         self.assertEqual(f.max_value, 1.5)
         self.assertEqual(f.min_value, 0.5)
 
+    def test_floatfield_validator_attributes(self):
+        f = FloatField(min_value=1.5, max_value=2.5)
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is greater than or equal to 1.5.']", f.clean, 1)
+        self.assertEqual(2, f.clean(2))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is less than or equal to 2.5.']", f.clean, 3)
+
+        f.min_value = 4
+        f.max_value = 5
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is greater than or equal to 4.']", f.clean, 3.5)
+        self.assertEqual(4.5, f.clean(4.5))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is less than or equal to 5.']", f.clean, 6.6)
+
+        f.min_value = None
+        f.max_value = None
+        self.assertEqual(0.5, f.clean(0.5))
+        self.assertEqual(5.5, f.clean(5.5))
+
     # DecimalField ################################################################
 
     def test_decimalfield_1(self):
@@ -297,6 +348,23 @@ class FieldsTests(TestCase):
         self.assertEqual(f.clean('.01'), Decimal(".01"))
         self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure that there are no more than 0 digits before the decimal point.']", f.clean, '1.1')
 
+    def test_decimalfield_validator_attributes(self):
+        f = DecimalField(min_value=Decimal('1.5'), max_value=Decimal('2.5'))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is greater than or equal to 1.5.']", f.clean, 1)
+        self.assertEqual(Decimal('2'), f.clean(2))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is less than or equal to 2.5.']", f.clean, 3)
+
+        f.min_value = Decimal('4')
+        f.max_value = Decimal('5')
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is greater than or equal to 4.']", f.clean, 3.5)
+        self.assertEqual(Decimal('4.5'), f.clean(4.5))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value is less than or equal to 5.']", f.clean, 6.6)
+
+        f.min_value = None
+        f.max_value = None
+        self.assertEqual(Decimal('0.5'), f.clean(0.5))
+        self.assertEqual(Decimal('5.5'), f.clean(5.5))
+
     # DateField ###################################################################
 
     def test_datefield_1(self):
@@ -466,6 +534,23 @@ class FieldsTests(TestCase):
         self.assertRaisesErrorWithMessage(ValidationError, "[u'Ensure this value has at most 10 characters (it has 11).']", f.clean, '12345678901')
         self.assertRaisesErrorWithMessage(ValidationError, "[u'Enter a valid value.']", f.clean, '12345a')
 
+    def test_regexfield_validator_attributes(self):
+        f = RegexField('^\d+$')
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Enter a valid value.']", f.clean, 'abc')
+        self.assertEqual(u'1234', f.clean('1234'))
+
+        f.regex = '^[a-z]+$'
+        self.assertEqual(u'abc', f.clean('abc'))
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Enter a valid value.']", f.clean, '1234')
+
+        f.regex = re.compile('^[^\w]+$')
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Enter a valid value.']", f.clean, 'abc')
+        self.assertRaisesErrorWithMessage(ValidationError, "[u'Enter a valid value.']", f.clean, '1234')
+        self.assertEqual(u'--', f.clean('--'))
+
+        f.regex = None
+        self.assertEqual(u'1-b-2', f.clean('1-b-2'))
+
     # EmailField ##################################################################
 
     def test_emailfield_1(self):
