#27434: Crashes during form validation when Model validation raises
ValidationErrors for fields not in the current form
-----------------------------------------------+------------------------
               Reporter:  Matthias Kestenholz  |          Owner:  nobody
                   Type:  Bug                  |         Status:  new
              Component:  Forms                |        Version:  1.10
               Severity:  Normal               |       Keywords:
           Triage Stage:  Unreviewed           |      Has patch:  0
    Needs documentation:  0                    |    Needs tests:  0
Patch needs improvement:  0                    |  Easy pickings:  0
                  UI/UX:  0                    |
-----------------------------------------------+------------------------
 Example:

 {{{
 class DictionaryValidationErrorModel(models.Model):
     field1 = models.CharField(max_length=100)
     field2 = models.CharField(max_length=100)
     field3 = models.CharField(max_length=100)

     def clean(self):
         super(DictionaryValidationErrorModel, self).clean()
         raise ValidationError({
             'field1': 'field1 error',
             'field2': 'field2 error',
         })
 }}}

 {{{
 class DictionaryValidationErrorTests(ValidationTestCase):
     def test_default_form(self):
         class ModelForm(forms.ModelForm):
             class Meta:
                 model = DictionaryValidationErrorModel
                 fields = ('field1', 'field2', 'field3')

         form = ModelForm({
             'field1': '1',
             'field2': '2',
             'field3': '3',
         })
         self.assertFalse(form.is_valid())
         self.assertEqual(set(form.errors.keys()), {'field1', 'field2'})

     def test_crash(self):
         class ModelForm(forms.ModelForm):
             class Meta:
                 model = DictionaryValidationErrorModel
                 fields = ('field1', 'field3')

         form = ModelForm({
             'field1': '1',
             'field2': '2',
             'field3': '3',
         })
         self.assertFalse(form.is_valid())
         self.assertEqual(set(form.errors.keys()), {'field1', 'field2'})
 }}}

 The problem I'm seeing is
 {{{

 ======================================================================
 ERROR: test_crash
 (validation.test_validators.DictionaryValidationErrorTests)
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/usr/lib/python3.5/unittest/case.py", line 59, in testPartExecutor
     yield
   File "/usr/lib/python3.5/unittest/case.py", line 601, in run
     testMethod()
   File
 "/home/matthias/Projects/django/tests/validation/test_validators.py", line
 62, in test_crash
     self.assertFalse(form.is_valid())
   File "/home/matthias/Projects/django/django/forms/forms.py", line 169,
 in is_valid
     return self.is_bound and not self.errors
   File "/home/matthias/Projects/django/django/forms/forms.py", line 161,
 in errors
     self.full_clean()
   File "/home/matthias/Projects/django/django/forms/forms.py", line 372,
 in full_clean
     self._post_clean()
   File "/home/matthias/Projects/django/django/forms/models.py", line 400,
 in _post_clean
     self._update_errors(e)
   File "/home/matthias/Projects/django/django/forms/models.py", line 374,
 in _update_errors
     self.add_error(None, errors)
   File "/home/matthias/Projects/django/django/forms/forms.py", line 338,
 in add_error
     "'%s' has no field named '%s'." % (self.__class__.__name__, field))
 ValueError: 'ModelForm' has no field named 'field2'.
 }}}

 This might be a thing for me to work on during the sprints. Also,
 
https://github.com/matthiask/django/commit/2d03c38f888262e63c179b57c0c6bd09312f6f99

 (Cc:ing Loïc because we discussed this at DUTH on wednesday evening.)

--
Ticket URL: <https://code.djangoproject.com/ticket/27434>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.b7793c2aa8829e39816aa2b521f70443%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to