{{{
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.
* owner: nobody => Matthias Kestenholz
* status: new => assigned
* has_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:1>
* version: 1.10 => master
* stage: Unreviewed => Accepted
Comment:
I'm still not sure if we should discard the error or move it to
`NON_FIELD_ERRORS` as suggested here but it shouldn't be crashing.
[https://github.com/django/django/pull/7473 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:2>
* needs_better_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:3>
* needs_better_patch: 1 => 0
Comment:
I hope the patch won't need further improvement, removing the flag for
now. Thanks.
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:4>
Comment (by Matthias Kestenholz):
New pull request containing only a documentation patch:
[https://github.com/django/django/pull/8394 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:5>
* stage: Accepted => Ready for checkin
Comment:
IMO this is ready.
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:6>
* component: Forms => Documentation
* needs_better_patch: 0 => 1
* stage: Ready for checkin => Accepted
* type: Bug => Cleanup/optimization
Comment:
I left a few ideas for improvement on the PR.
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:7>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"e8c056c31a5b353e7b50a405c00db12c28f4a756" e8c056c]:
{{{
#!CommitTicketReference repository=""
revision="e8c056c31a5b353e7b50a405c00db12c28f4a756"
Fixed #27434 -- Doc'd how to raise a model validation error for a field
not in a model form.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:8>
Comment (by Tim Graham <timograham@…>):
In [changeset:"a1c6c220e2ac86a74869d0017cd658115cc4ad7b" a1c6c220]:
{{{
#!CommitTicketReference repository=""
revision="a1c6c220e2ac86a74869d0017cd658115cc4ad7b"
[1.11.x] Fixed #27434 -- Doc'd how to raise a model validation error for a
field not in a model form.
Backport of e8c056c31a5b353e7b50a405c00db12c28f4a756 from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/27434#comment:9>