commit ffe91e663f807ed138da33413d938ef3c98719c0
Author: Honza Král <Honza.Kral@gmail.com>
Date:   Sun Nov 11 21:24:18 2007 +0100

    Added Formset Overridability for #4667
    
    http://code.djangoproject.com/ticket/4667

diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index cafa054..d5f4c15 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -1,7 +1,6 @@
 from django import oldforms, template
 from django import newforms as forms
 from django.newforms.formsets import all_valid
-from django.contrib.contenttypes.models import ContentType
 from django.contrib.admin import widgets
 from django.contrib.admin.util import get_deleted_objects
 from django.core.exceptions import ImproperlyConfigured, PermissionDenied
@@ -451,6 +450,7 @@ class ModelAdmin(BaseModelAdmin):
             return HttpResponseRedirect("../")
 
     def render_change_form(self, model, context, add=False, change=False, form_url=''):
+        from django.contrib.contenttypes.models import ContentType
         opts = model._meta
         app_label = opts.app_label
         ordered_objects = opts.get_ordered_objects()
@@ -721,6 +721,7 @@ class InlineModelAdmin(BaseModelAdmin):
     template = None
     verbose_name = None
     verbose_name_plural = None
+    formset = None
 
     def __init__(self, parent_model, admin_site):
         self.admin_site = admin_site
@@ -738,7 +739,7 @@ class InlineModelAdmin(BaseModelAdmin):
             fields = flatten_fieldsets(self.declared_fieldsets)
         else:
             fields = None
-        return forms.inline_formset(self.parent_model, self.model, fk_name=self.fk_name, fields=fields, formfield_callback=self.formfield_for_dbfield, extra=self.extra)
+        return forms.inline_formset(self.parent_model, self.model, fk_name=self.fk_name, fields=fields, formfield_callback=self.formfield_for_dbfield, extra=self.extra, formset=self.formset)
 
     def formset_change(self, request, obj):
         """Returns an InlineFormSet class for use in admin change views."""
@@ -746,7 +747,7 @@ class InlineModelAdmin(BaseModelAdmin):
             fields = flatten_fieldsets(self.declared_fieldsets)
         else:
             fields = None
-        return forms.inline_formset(self.parent_model, self.model, fk_name=self.fk_name, fields=fields, formfield_callback=self.formfield_for_dbfield, extra=self.extra)
+        return forms.inline_formset(self.parent_model, self.model, fk_name=self.fk_name, fields=fields, formfield_callback=self.formfield_for_dbfield, extra=self.extra, formset=self.formset)
 
     def fieldsets_add(self, request):
         if self.declared_fieldsets:
diff --git a/django/newforms/models.py b/django/newforms/models.py
index 3a80517..ac9f2d9 100644
--- a/django/newforms/models.py
+++ b/django/newforms/models.py
@@ -408,7 +408,7 @@ def get_foreign_key(parent_model, model, fk_name=None):
             raise Exception("%s has more than 1 ForeignKey to %s" % (model, parent_model))
     return fk
 
-def inline_formset(parent_model, model, fk_name=None, fields=None, extra=3, orderable=False, deletable=True, formfield_callback=lambda f: f.formfield()):
+def inline_formset(parent_model, model, fk_name=None, fields=None, extra=3, orderable=False, deletable=True, formfield_callback=lambda f: f.formfield(), formset=None):
     """
     Returns an ``InlineFormset`` for the given kwargs.
 
@@ -417,7 +417,7 @@ def inline_formset(parent_model, model, fk_name=None, fields=None, extra=3, orde
     """
     fk = get_foreign_key(parent_model, model, fk_name=fk_name)
     # let the formset handle object deletion by default
-    FormSet = formset_for_model(model, formset=InlineFormset, fields=fields,
+    FormSet = formset_for_model(model, formset=formset or InlineFormset, fields=fields,
                                 formfield_callback=formfield_callback,
                                 extra=extra, orderable=orderable,
                                 deletable=deletable)
