mirror of
https://github.com/django/django.git
synced 2025-11-07 07:15:35 +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
@@ -433,16 +433,21 @@ class BaseFormSet:
|
||||
|
||||
def formset_factory(form, formset=BaseFormSet, extra=1, can_order=False,
|
||||
can_delete=False, max_num=None, validate_max=False,
|
||||
min_num=None, validate_min=False):
|
||||
min_num=None, validate_min=False, absolute_max=None):
|
||||
"""Return a FormSet for the given form class."""
|
||||
if min_num is None:
|
||||
min_num = DEFAULT_MIN_NUM
|
||||
if max_num is None:
|
||||
max_num = DEFAULT_MAX_NUM
|
||||
# hard limit on forms instantiated, to prevent memory-exhaustion attacks
|
||||
# limit is simply max_num + DEFAULT_MAX_NUM (which is 2*DEFAULT_MAX_NUM
|
||||
# if max_num is None in the first place)
|
||||
absolute_max = max_num + DEFAULT_MAX_NUM
|
||||
# absolute_max is a hard limit on forms instantiated, to prevent
|
||||
# memory-exhaustion attacks. Default to max_num + DEFAULT_MAX_NUM
|
||||
# (which is 2 * DEFAULT_MAX_NUM if max_num is None in the first place).
|
||||
if absolute_max is None:
|
||||
absolute_max = max_num + DEFAULT_MAX_NUM
|
||||
if max_num > absolute_max:
|
||||
raise ValueError(
|
||||
"'absolute_max' must be greater or equal to 'max_num'."
|
||||
)
|
||||
attrs = {
|
||||
'form': form,
|
||||
'extra': extra,
|
||||
|
||||
@@ -862,7 +862,8 @@ def modelformset_factory(model, form=ModelForm, formfield_callback=None,
|
||||
can_order=False, max_num=None, fields=None, exclude=None,
|
||||
widgets=None, validate_max=False, localized_fields=None,
|
||||
labels=None, help_texts=None, error_messages=None,
|
||||
min_num=None, validate_min=False, field_classes=None):
|
||||
min_num=None, validate_min=False, field_classes=None,
|
||||
absolute_max=None):
|
||||
"""Return a FormSet class for the given Django model class."""
|
||||
meta = getattr(form, 'Meta', None)
|
||||
if (getattr(meta, 'fields', fields) is None and
|
||||
@@ -879,7 +880,8 @@ def modelformset_factory(model, form=ModelForm, formfield_callback=None,
|
||||
error_messages=error_messages, field_classes=field_classes)
|
||||
FormSet = formset_factory(form, formset, extra=extra, min_num=min_num, max_num=max_num,
|
||||
can_order=can_order, can_delete=can_delete,
|
||||
validate_min=validate_min, validate_max=validate_max)
|
||||
validate_min=validate_min, validate_max=validate_max,
|
||||
absolute_max=absolute_max)
|
||||
FormSet.model = model
|
||||
return FormSet
|
||||
|
||||
@@ -1048,7 +1050,8 @@ def inlineformset_factory(parent_model, model, form=ModelForm,
|
||||
can_delete=True, max_num=None, formfield_callback=None,
|
||||
widgets=None, validate_max=False, localized_fields=None,
|
||||
labels=None, help_texts=None, error_messages=None,
|
||||
min_num=None, validate_min=False, field_classes=None):
|
||||
min_num=None, validate_min=False, field_classes=None,
|
||||
absolute_max=None):
|
||||
"""
|
||||
Return an ``InlineFormSet`` for the given kwargs.
|
||||
|
||||
@@ -1078,6 +1081,7 @@ def inlineformset_factory(parent_model, model, form=ModelForm,
|
||||
'help_texts': help_texts,
|
||||
'error_messages': error_messages,
|
||||
'field_classes': field_classes,
|
||||
'absolute_max': absolute_max,
|
||||
}
|
||||
FormSet = modelformset_factory(model, **kwargs)
|
||||
FormSet.fk = fk
|
||||
|
||||
Reference in New Issue
Block a user