Add missing `polymorphic_modelformset_factory` method

fix_request_path_info
Diederik van der Boor 2016-08-10 12:50:15 +02:00
parent 352b56e104
commit 8bce015199
2 changed files with 59 additions and 1 deletions

View File

@ -29,6 +29,7 @@ from .models import (
BasePolymorphicModelFormSet, BasePolymorphicModelFormSet,
BasePolymorphicInlineFormSet, BasePolymorphicInlineFormSet,
PolymorphicFormSetChild, PolymorphicFormSetChild,
polymorphic_modelformset_factory,
polymorphic_inlineformset_factory, polymorphic_inlineformset_factory,
polymorphic_child_forms_factory, polymorphic_child_forms_factory,
) )
@ -43,6 +44,7 @@ __all__ = (
'BasePolymorphicModelFormSet', 'BasePolymorphicModelFormSet',
'BasePolymorphicInlineFormSet', 'BasePolymorphicInlineFormSet',
'PolymorphicFormSetChild', 'PolymorphicFormSetChild',
'polymorphic_modelformset_factory',
'polymorphic_inlineformset_factory', 'polymorphic_inlineformset_factory',
'polymorphic_child_forms_factory', 'polymorphic_child_forms_factory',
'BaseGenericPolymorphicInlineFormSet', 'BaseGenericPolymorphicInlineFormSet',

View File

@ -4,7 +4,7 @@ import django
from django import forms from django import forms
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ImproperlyConfigured, ValidationError from django.core.exceptions import ImproperlyConfigured, ValidationError
from django.forms.models import ModelForm, BaseModelFormSet, BaseInlineFormSet, modelform_factory, inlineformset_factory from django.forms.models import ModelForm, BaseModelFormSet, BaseInlineFormSet, modelform_factory, modelformset_factory, inlineformset_factory
from django.utils.functional import cached_property from django.utils.functional import cached_property
from .utils import add_media from .utils import add_media
@ -247,6 +247,62 @@ class BasePolymorphicModelFormSet(BaseModelFormSet):
raise RuntimeError("'empty_form' is not used in polymorphic formsets, use 'empty_forms' instead.") raise RuntimeError("'empty_form' is not used in polymorphic formsets, use 'empty_forms' instead.")
def polymorphic_modelformset_factory(model, formset_children,
formset=BasePolymorphicModelFormSet, fk_name=None,
# Base field
# TODO: should these fields be removed in favor of creating
# the base form as a formset child too?
form=ModelForm,
fields=None, exclude=None, extra=1, can_order=False,
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, child_form_kwargs=None):
"""
Construct the class for an polymorphic model formset.
All arguments are identical to :func:`~django.forms.models.modelformset_factory`,
with the exception of the ``formset_children`` argument.
:param formset_children: A list of all child :class:`PolymorphicFormSetChild` objects
that tell the inline how to render the child model types.
:type formset_children: Iterable[PolymorphicFormSetChild]
:rtype: type
"""
kwargs = {
'model': model,
'form': form,
'formfield_callback': formfield_callback,
'formset': formset,
'fk_name': fk_name,
'extra': extra,
'can_delete': can_delete,
'can_order': can_order,
'fields': fields,
'exclude': exclude,
'min_num': min_num,
'max_num': max_num,
'widgets': widgets,
'validate_min': validate_min,
'validate_max': validate_max,
'localized_fields': localized_fields,
'labels': labels,
'help_texts': help_texts,
'error_messages': error_messages,
'field_classes': field_classes,
}
FormSet = modelformset_factory(**kwargs)
child_kwargs = {
#'exclude': exclude,
}
if child_form_kwargs:
child_kwargs.update(child_form_kwargs)
FormSet.child_forms = polymorphic_child_forms_factory(formset_children, **child_kwargs)
return FormSet
class BasePolymorphicInlineFormSet(BaseInlineFormSet, BasePolymorphicModelFormSet): class BasePolymorphicInlineFormSet(BaseInlineFormSet, BasePolymorphicModelFormSet):
""" """
Polymorphic formset variation for inline formsets Polymorphic formset variation for inline formsets