mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Merge pull request #1094 from senko/ticket_11160
Fixed #11160: Formset non_form_errors returns ErrorList() if is_valid is not called
This commit is contained in:
		
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							| @@ -474,6 +474,7 @@ answer newbie questions, and generally made Django that much better: | ||||
|     Luciano Ramalho | ||||
|     Amit Ramon <amit.ramon@gmail.com> | ||||
|     Philippe Raoult <philippe.raoult@n2nsoft.com> | ||||
|     Senko Rašić <senko.rasic@dobarkod.hr> | ||||
|     Massimiliano Ravelli <massimiliano.ravelli@gmail.com> | ||||
|     Brian Ray <http://brianray.chipy.org/> | ||||
|     Lee Reilly <lee@leereilly.net> | ||||
|   | ||||
| @@ -250,9 +250,9 @@ class BaseFormSet(object): | ||||
|         form -- i.e., from formset.clean(). Returns an empty ErrorList if there | ||||
|         are none. | ||||
|         """ | ||||
|         if self._non_form_errors is not None: | ||||
|             return self._non_form_errors | ||||
|         return self.error_class() | ||||
|         if self._non_form_errors is None: | ||||
|             self.full_clean() | ||||
|         return self._non_form_errors | ||||
|  | ||||
|     @property | ||||
|     def errors(self): | ||||
| @@ -291,9 +291,12 @@ class BaseFormSet(object): | ||||
|  | ||||
|     def full_clean(self): | ||||
|         """ | ||||
|         Cleans all of self.data and populates self._errors. | ||||
|         Cleans all of self.data and populates self._errors and | ||||
|         self._non_form_errors. | ||||
|         """ | ||||
|         self._errors = [] | ||||
|         self._non_form_errors = self.error_class() | ||||
|  | ||||
|         if not self.is_bound: # Stop further processing. | ||||
|             return | ||||
|         for i in range(0, self.total_form_count()): | ||||
|   | ||||
| @@ -972,6 +972,20 @@ class FormsFormsetTestCase(TestCase): | ||||
|         finally: | ||||
|             formsets.DEFAULT_MAX_NUM = _old_DEFAULT_MAX_NUM | ||||
|  | ||||
|     def test_non_form_errors_run_full_clean(self): | ||||
|         # Regression test for #11160 | ||||
|         # If non_form_errors() is called without calling is_valid() first, | ||||
|         # it should ensure that full_clean() is called. | ||||
|         class BaseCustomFormSet(BaseFormSet): | ||||
|             def clean(self): | ||||
|                 raise ValidationError("This is a non-form error") | ||||
|  | ||||
|         ChoiceFormSet = formset_factory(Choice, formset=BaseCustomFormSet) | ||||
|         formset = ChoiceFormSet(data, auto_id=False, prefix='choices') | ||||
|         self.assertTrue(isinstance(formset.non_form_errors(), ErrorList)) | ||||
|         self.assertEqual(list(formset.non_form_errors()), | ||||
|             ['This is a non-form error']) | ||||
|  | ||||
|  | ||||
| data = { | ||||
|     'choices-TOTAL_FORMS': '1', # the number of forms rendered | ||||
|   | ||||
		Reference in New Issue
	
	Block a user