Loading django/forms/fields.py +1 −0 Original line number Diff line number Diff line Loading @@ -908,6 +908,7 @@ class MultiValueField(Field): out = self.compress(clean_data) self.validate(out) self.run_validators(out) return out def compress(self, data_list): Loading tests/regressiontests/forms/tests/forms.py +29 −0 Original line number Diff line number Diff line Loading @@ -1778,3 +1778,32 @@ class FormsTestCase(TestCase): form = EventForm() self.assertHTMLEqual(form.as_ul(), u'<input type="hidden" name="happened_at_0" id="id_happened_at_0" /><input type="hidden" name="happened_at_1" id="id_happened_at_1" />') def test_multivalue_field_validation(self): def bad_names(value): if value == 'bad value': raise ValidationError('bad value not allowed') class NameField(MultiValueField): def __init__(self, fields=(), *args, **kwargs): fields = (CharField(label='First name', max_length=10), CharField(label='Last name', max_length=10)) super(NameField, self).__init__(fields=fields, *args, **kwargs) def compress(self, data_list): return ' '.join(data_list) class NameForm(Form): name = NameField(validators=[bad_names]) form = NameForm(data={'name' : ['bad', 'value']}) form.full_clean() self.assertFalse(form.is_valid()) self.assertEqual(form.errors, {'name': [u'bad value not allowed']}) form = NameForm(data={'name' : ['should be overly', 'long for the field names']}) self.assertFalse(form.is_valid()) self.assertEqual(form.errors, {'name': [u'Ensure this value has at most 10 characters (it has 16).', u'Ensure this value has at most 10 characters (it has 24).']}) form = NameForm(data={'name' : ['fname', 'lname']}) self.assertTrue(form.is_valid()) self.assertEqual(form.cleaned_data, {'name' : 'fname lname'}) Loading
django/forms/fields.py +1 −0 Original line number Diff line number Diff line Loading @@ -908,6 +908,7 @@ class MultiValueField(Field): out = self.compress(clean_data) self.validate(out) self.run_validators(out) return out def compress(self, data_list): Loading
tests/regressiontests/forms/tests/forms.py +29 −0 Original line number Diff line number Diff line Loading @@ -1778,3 +1778,32 @@ class FormsTestCase(TestCase): form = EventForm() self.assertHTMLEqual(form.as_ul(), u'<input type="hidden" name="happened_at_0" id="id_happened_at_0" /><input type="hidden" name="happened_at_1" id="id_happened_at_1" />') def test_multivalue_field_validation(self): def bad_names(value): if value == 'bad value': raise ValidationError('bad value not allowed') class NameField(MultiValueField): def __init__(self, fields=(), *args, **kwargs): fields = (CharField(label='First name', max_length=10), CharField(label='Last name', max_length=10)) super(NameField, self).__init__(fields=fields, *args, **kwargs) def compress(self, data_list): return ' '.join(data_list) class NameForm(Form): name = NameField(validators=[bad_names]) form = NameForm(data={'name' : ['bad', 'value']}) form.full_clean() self.assertFalse(form.is_valid()) self.assertEqual(form.errors, {'name': [u'bad value not allowed']}) form = NameForm(data={'name' : ['should be overly', 'long for the field names']}) self.assertFalse(form.is_valid()) self.assertEqual(form.errors, {'name': [u'Ensure this value has at most 10 characters (it has 16).', u'Ensure this value has at most 10 characters (it has 24).']}) form = NameForm(data={'name' : ['fname', 'lname']}) self.assertTrue(form.is_valid()) self.assertEqual(form.cleaned_data, {'name' : 'fname lname'})