Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 6783)
+++ django/contrib/admin/options.py	(working copy)
@@ -6,6 +6,7 @@
 from django.contrib.admin.util import get_deleted_objects
 from django.core.exceptions import ImproperlyConfigured, PermissionDenied
 from django.db import models
+from django.db.models.query import Q
 from django.http import Http404, HttpResponse, HttpResponseRedirect
 from django.shortcuts import get_object_or_404, render_to_response
 from django.utils.html import escape
@@ -720,6 +721,7 @@
     model = None
     fk_name = None
     extra = 3
+    max_num = None
     template = None
     verbose_name = None
     verbose_name_plural = None
@@ -734,6 +736,20 @@
         if self.verbose_name_plural is None:
             self.verbose_name_plural = self.model._meta.verbose_name_plural
 
+    def get_extra_max(self, obj):
+        """Returns how many extra fields should be added. 
+        with the constrain to never add more than max_num."""
+        # get the foreign key to lookup the name 
+        fk_parent=forms.models.get_foreign_key(self.parent_model, self.model, self.fk_name)
+        entries_num = len(self.model.objects.filter( apply(Q, (), { fk_parent.name: obj } ) ) )
+        if self.max_num:
+            current_extra = self.max_num - entries_num
+        else:
+            current_extra = self.extra
+        if current_extra > self.extra:
+            current_extra = self.extra
+        return current_extra
+
     def formset_add(self, request):
         """Returns an InlineFormSet class for use in admin add views."""
         if self.declared_fieldsets:
@@ -748,7 +764,7 @@
             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.get_extra_max(obj))
 
     def fieldsets_add(self, request):
         if self.declared_fieldsets:
