mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Fixed #33822 -- Fixed save() crash on model formsets when not created by modelformset_factory().
Thanks Claude Paroz for the report.
Regression in e87f57fdb8.
			
			
This commit is contained in:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							249ecc437f
						
					
				
				
					commit
					18c5ba07cc
				
			| @@ -657,6 +657,7 @@ class BaseModelFormSet(BaseFormSet): | ||||
|     """ | ||||
|  | ||||
|     model = None | ||||
|     edit_only = False | ||||
|  | ||||
|     # Set of fields that must be unique among forms of this set. | ||||
|     unique_fields = set() | ||||
|   | ||||
| @@ -6,6 +6,7 @@ from decimal import Decimal | ||||
| from django import forms | ||||
| from django.core.exceptions import ImproperlyConfigured | ||||
| from django.db import models | ||||
| from django.forms.formsets import formset_factory | ||||
| from django.forms.models import ( | ||||
|     BaseModelFormSet, | ||||
|     _get_foreign_key, | ||||
| @@ -2066,6 +2067,36 @@ class ModelFormsetTest(TestCase): | ||||
|         formset.save() | ||||
|         self.assertCountEqual(Author.objects.all(), [charles, walt]) | ||||
|  | ||||
|     def test_edit_only_formset_factory_with_basemodelformset(self): | ||||
|         charles = Author.objects.create(name="Charles Baudelaire") | ||||
|  | ||||
|         class AuthorForm(forms.ModelForm): | ||||
|             class Meta: | ||||
|                 model = Author | ||||
|                 fields = "__all__" | ||||
|  | ||||
|         class BaseAuthorFormSet(BaseModelFormSet): | ||||
|             def __init__(self, *args, **kwargs): | ||||
|                 self.model = Author | ||||
|                 super().__init__(*args, **kwargs) | ||||
|  | ||||
|         AuthorFormSet = formset_factory(AuthorForm, formset=BaseAuthorFormSet) | ||||
|         data = { | ||||
|             "form-TOTAL_FORMS": "2", | ||||
|             "form-INITIAL_FORMS": "1", | ||||
|             "form-MAX_NUM_FORMS": "0", | ||||
|             "form-0-id": charles.pk, | ||||
|             "form-0-name": "Shawn Dong", | ||||
|             "form-1-name": "Walt Whitman", | ||||
|         } | ||||
|         formset = AuthorFormSet(data) | ||||
|         self.assertIs(formset.is_valid(), True) | ||||
|         formset.save() | ||||
|         self.assertEqual(Author.objects.count(), 2) | ||||
|         charles.refresh_from_db() | ||||
|         self.assertEqual(charles.name, "Shawn Dong") | ||||
|         self.assertEqual(Author.objects.count(), 2) | ||||
|  | ||||
|  | ||||
| class TestModelFormsetOverridesTroughFormMeta(TestCase): | ||||
|     def test_modelformset_factory_widgets(self): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user