mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #20347 -- Allowed customizing the maximum number of instantiated forms in formsets.
Co-authored-by: ethurgood <ethurgood@gmail.com>
This commit is contained in:
committed by
Mariusz Felisiak
parent
b5aa9cb20f
commit
433dd737f9
@@ -892,6 +892,55 @@ class FormsFormsetTestCase(SimpleTestCase):
|
||||
)
|
||||
self.assertEqual(formset.absolute_max, 2000)
|
||||
|
||||
def test_absolute_max(self):
|
||||
data = {
|
||||
'form-TOTAL_FORMS': '2001',
|
||||
'form-INITIAL_FORMS': '0',
|
||||
'form-MAX_NUM_FORMS': '0',
|
||||
}
|
||||
AbsoluteMaxFavoriteDrinksFormSet = formset_factory(
|
||||
FavoriteDrinkForm,
|
||||
absolute_max=3000,
|
||||
)
|
||||
formset = AbsoluteMaxFavoriteDrinksFormSet(data=data)
|
||||
self.assertIs(formset.is_valid(), True)
|
||||
self.assertEqual(len(formset.forms), 2001)
|
||||
# absolute_max provides a hard limit.
|
||||
data['form-TOTAL_FORMS'] = '3001'
|
||||
formset = AbsoluteMaxFavoriteDrinksFormSet(data=data)
|
||||
self.assertIs(formset.is_valid(), False)
|
||||
self.assertEqual(len(formset.forms), 3000)
|
||||
self.assertEqual(
|
||||
formset.non_form_errors(),
|
||||
['Please submit 1000 or fewer forms.'],
|
||||
)
|
||||
|
||||
def test_absolute_max_with_max_num(self):
|
||||
data = {
|
||||
'form-TOTAL_FORMS': '1001',
|
||||
'form-INITIAL_FORMS': '0',
|
||||
'form-MAX_NUM_FORMS': '0',
|
||||
}
|
||||
LimitedFavoriteDrinksFormSet = formset_factory(
|
||||
FavoriteDrinkForm,
|
||||
max_num=30,
|
||||
absolute_max=1000,
|
||||
)
|
||||
formset = LimitedFavoriteDrinksFormSet(data=data)
|
||||
self.assertIs(formset.is_valid(), False)
|
||||
self.assertEqual(len(formset.forms), 1000)
|
||||
self.assertEqual(
|
||||
formset.non_form_errors(),
|
||||
['Please submit 30 or fewer forms.'],
|
||||
)
|
||||
|
||||
def test_absolute_max_invalid(self):
|
||||
msg = "'absolute_max' must be greater or equal to 'max_num'."
|
||||
for max_num in [None, 31]:
|
||||
with self.subTest(max_num=max_num):
|
||||
with self.assertRaisesMessage(ValueError, msg):
|
||||
formset_factory(FavoriteDrinkForm, max_num=max_num, absolute_max=30)
|
||||
|
||||
def test_more_initial_form_result_in_one(self):
|
||||
"""
|
||||
One form from initial and extra=3 with max_num=2 results in the one
|
||||
|
||||
Reference in New Issue
Block a user