From 8f4540b2e68d4b9143d38d8af197cb4b794821b4 Mon Sep 17 00:00:00 2001 From: Joseph Kocherhans Date: Wed, 10 Feb 2010 00:34:45 +0000 Subject: [PATCH] Fixed #12698. Model.clean() used with a ModelForm no longer causes a KeyError when raising a ValidationError. Note that previously it was possible to raise a ValidationError in the same place with a message_dict attribute. That behavior was a bug and will no longer have the same behavior. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12402 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/forms/models.py | 2 +- .../model_forms_regress/models.py | 10 ++++++++++ .../model_forms_regress/tests.py | 19 ++++++++++++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/django/forms/models.py b/django/forms/models.py index f343a1cbcd..0039516f47 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -317,7 +317,7 @@ class BaseModelForm(BaseForm): try: self.instance.clean() except ValidationError, e: - self._update_errors(e.message_dict) + self._update_errors({NON_FIELD_ERRORS: e.messages}) super(BaseModelForm, self)._clean_form() def validate_unique(self): diff --git a/tests/regressiontests/model_forms_regress/models.py b/tests/regressiontests/model_forms_regress/models.py index 376586e94f..23ac745274 100644 --- a/tests/regressiontests/model_forms_regress/models.py +++ b/tests/regressiontests/model_forms_regress/models.py @@ -1,5 +1,7 @@ import os from django.db import models +from django.core.exceptions import ValidationError + class Person(models.Model): name = models.CharField(max_length=100) @@ -37,3 +39,11 @@ class CustomFileField(models.FileField): class CustomFF(models.Model): f = CustomFileField(upload_to='unused', blank=True) + +class RealPerson(models.Model): + name = models.CharField(max_length=100) + + def clean(self): + if self.name.lower() == 'anonymous': + raise ValidationError("Please specify a real name.") + diff --git a/tests/regressiontests/model_forms_regress/tests.py b/tests/regressiontests/model_forms_regress/tests.py index 57d56551e5..3eeecb28e4 100644 --- a/tests/regressiontests/model_forms_regress/tests.py +++ b/tests/regressiontests/model_forms_regress/tests.py @@ -6,7 +6,8 @@ from django.forms.models import modelform_factory from django.conf import settings from django.test import TestCase -from models import Person, Triple, FilePathModel, Article, Publication, CustomFF +from models import Person, RealPerson, Triple, FilePathModel, Article, Publication, CustomFF + class ModelMultipleChoiceFieldTests(TestCase): @@ -117,7 +118,7 @@ class CFFForm(forms.ModelForm): class CustomFieldSaveTests(TestCase): def test_save(self): "Regression for #11149: save_form_data should be called only once" - + # It's enough that the form saves without error -- the custom save routine will # generate an AssertionError if it is called more than once during save. form = CFFForm(data = {'f': None}) @@ -129,8 +130,20 @@ class ModelChoiceIteratorTests(TestCase): class Meta: model = Article fields = ["publications"] - + Publication.objects.create(title="Pravda", date_published=date(1991, 8, 22)) f = Form() self.assertEqual(len(f.fields["publications"].choices), 1) + +class RealPersonForm(forms.ModelForm): + class Meta: + model = RealPerson + +class CustomModelFormSaveMethod(TestCase): + def test_string_message(self): + data = {'name': 'anonymous'} + form = RealPersonForm(data) + self.assertEqual(form.is_valid(), False) + self.assertEqual(form.errors['__all__'], ['Please specify a real name.']) +