Commit 36aecb12 authored by Tim Graham's avatar Tim Graham
Browse files

Fixed #19425 - Added InlineModelAdmin.get_extra hook.

Thanks dave@ for the suggestion and Rohan Jain for the patch.
parent 7902fd74
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -1512,6 +1512,10 @@ class InlineModelAdmin(BaseModelAdmin):
            js.extend(['SelectBox.js', 'SelectFilter2.js'])
        return forms.Media(js=[static('admin/js/%s' % url) for url in js])

    def get_extra(self, request, obj=None, **kwargs):
        """Hook for customizing the number of extra inline forms."""
        return self.extra

    def get_formset(self, request, obj=None, **kwargs):
        """Returns a BaseInlineFormSet class for use in admin add/change views."""
        if self.declared_fieldsets:
@@ -1538,7 +1542,7 @@ class InlineModelAdmin(BaseModelAdmin):
            "fields": fields,
            "exclude": exclude,
            "formfield_callback": partial(self.formfield_for_dbfield, request=request),
            "extra": self.extra,
            "extra": self.get_extra(request, obj, **kwargs),
            "max_num": self.max_num,
            "can_delete": can_delete,
        }
+25 −0
Original line number Diff line number Diff line
@@ -1715,6 +1715,11 @@ The ``InlineModelAdmin`` class adds:
    The dynamic link will not appear if the number of currently displayed forms
    exceeds ``max_num``, or if the user does not have JavaScript enabled.

    .. versionadded:: 1.6

    :meth:`InlineModelAdmin.get_extra` also allows you to customize the number
    of extra forms.

    .. _ref-contrib-admin-inline-max-num:

.. attribute:: InlineModelAdmin.max_num
@@ -1762,6 +1767,26 @@ The ``InlineModelAdmin`` class adds:
    Returns a ``BaseInlineFormSet`` class for use in admin add/change views.
    See the example for :class:`ModelAdmin.get_formsets`.

.. method:: InlineModelAdmin.get_extra(self, request, obj=None, **kwargs)

    .. versionadded:: 1.6

    Returns the number of extra inline forms to use. By default, returns the
    :attr:`InlineModelAdmin.extra` attribute.

    Override this method to programmatically determine the number of extra
    inline forms. For example, this may be based on the model instance
    (passed as the keyword argument ``obj``)::

        class BinaryTreeAdmin(admin.TabularInline):
            model = BinaryTree

            def get_extra(self, request, obj=None, **kwargs):
                extra = 2
                if obj:
                    return extra - obj.binarytree_set.count()
                return extra

Working with a model with two or more foreign keys to the same parent model
---------------------------------------------------------------------------

+4 −0
Original line number Diff line number Diff line
@@ -292,6 +292,10 @@ Minor features
  :meth:`~django.db.models.query.QuerySet.select_related` can be cleared using
  ``select_related(None)``.

* The :meth:`~django.contrib.admin.InlineModelAdmin.get_extra` method on
  :class:`~django.contrib.admin.InlineModelAdmin` may be overridden to
  customize the number of extra inline forms.

Backwards incompatible changes in 1.6
=====================================

+12 −0
Original line number Diff line number Diff line
@@ -129,6 +129,17 @@ class ChildModel1Inline(admin.TabularInline):
class ChildModel2Inline(admin.StackedInline):
    model = ChildModel2

# admin for #19425
class BinaryTreeAdmin(admin.TabularInline):
    model = BinaryTree

    def get_extra(self, request, obj=None, **kwargs):
        extra = 2
        if obj:
            return extra - obj.binarytree_set.count()

        return extra

# admin for #19524
class SightingInline(admin.TabularInline):
    model = Sighting
@@ -150,4 +161,5 @@ site.register(Author, AuthorAdmin)
site.register(CapoFamiglia, inlines=[ConsigliereInline, SottoCapoInline, ReadOnlyInlineInline])
site.register(ProfileCollection, inlines=[ProfileInline])
site.register(ParentModelWithCustomPk, inlines=[ChildModel1Inline, ChildModel2Inline])
site.register(BinaryTree, inlines=[BinaryTreeAdmin])
site.register(ExtraTerrestrial, inlines=[SightingInline])
+6 −0
Original line number Diff line number Diff line
@@ -183,6 +183,12 @@ class ChildModel2(models.Model):
    def get_absolute_url(self):
        return '/child_model2/'


# Models for #19425
class BinaryTree(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey('self', null=True, blank=True)

# Models for #19524

class LifeForm(models.Model):
Loading