mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	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
This commit is contained in:
		| @@ -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): | ||||
|   | ||||
| @@ -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.") | ||||
|  | ||||
|   | ||||
| @@ -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.'])  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user