Index: docs/ref/contrib/admin/index.txt
===================================================================
--- docs/ref/contrib/admin/index.txt	(revision 13238)
+++ docs/ref/contrib/admin/index.txt	(working copy)
@@ -1053,6 +1053,8 @@
 passed through to ``inlineformset_factory`` when creating the formset for this
 inline.
 
+.. _ref-contrib-admin-inline-extra:
+
 ``extra``
 ~~~~~~~~~
 
@@ -1062,9 +1064,14 @@
 
 .. versionadded:: 1.2
 
-Extra forms for inlines will be hidden and replaced with a link to dynamically
-add any number of new inlines for users with Javascript enabled.
+Extra forms for inlines will be hidden and replaced with a "Add another" link to
+dynamically add any number of new inlines for users with JavaScript enabled.
 
+That dynamic link will not appear if ``max_num`` is less than the number of
+currently displayed forms.
+
+.. _ref-contrib-admin-inline-max-num:
+
 ``max_num``
 ~~~~~~~~~~~
 
Index: docs/releases/1.2.txt
===================================================================
--- docs/releases/1.2.txt	(revision 13238)
+++ docs/releases/1.2.txt	(working copy)
@@ -351,6 +351,46 @@
 only time this should ever be an issue is if you were expecting printing the
 ``repr`` of a ``BooleanField`` to print ``1`` or ``0``.
 
+Changed semantics of ``max_num`` in formsets, model formsets
+------------------------------------------------------------
+
+As part of enhancements made to the handling of formsets and model formsets,
+the semantics and default values of the ``max_num`` parameters to the
+:ref:`django.forms.formsets.formset_factory() <formsets-max-num>` and
+:ref:`django.forms.models.modelformset_factory() <model-formsets-max-num>`
+functions have been changed in 1.2.
+
+Previously, the default value for these parameters was ``0`` (zero) and it
+indicated no limit had to be imposed by the formset machinery on the number of
+generated forms. Starting with 1.2, the value used to indicate that is 
+``None``, and ``None`` is the new default value accordingly. This frees the 
+``0`` value so the developer can use it in the following ways:
+
+    * For ``formset_factory()``: To force no form to be generated at all in the
+      formset when an instance is rendered, irrespective of the value of the
+      ``extra`` parameter or the value of the ``initial`` parameter passed to
+      the class ``__init__`` method.
+
+    * For ``modelformset_factory()``: To force no extra blank forms to exist
+      when an instance of the model formset class is rendered, irrespective of
+      the value of the ``extra`` parameter. The forms representing existing
+      model instances passed in the ``queryset`` parameter to the class
+      ``__init__`` method are always shown, no truncation of these forms is
+      performed.
+
+As model formsets are the basis of the admin app inlines functionality, these
+changes also apply to the equally-named ``max_num`` admin
+``(Tabular|Stacked)Inline`` :ref:`option <ref-contrib-admin-inline-max-num>`.
+
+This means that if you were specifying a value of ``0`` for ``max_num`` or were
+leaving its value out in one of these places relying on the previous default
+values, then it is possible that you will need to review and modify your code in
+such spots.
+
+.. seealso::
+
+    :ref:`1.2-js-assisted-inlines`
+
 .. _deprecated-features-1.2:
 
 Features deprecated in 1.2
@@ -611,7 +651,7 @@
 ``SpatialBackend``
 ^^^^^^^^^^^^^^^^^^
 
-Prior to the creation of the separate spatial backends, the 
+Prior to the creation of the separate spatial backends, the
 ``django.contrib.gis.db.backend.SpatialBackend`` object was
 provided as an abstraction to introspect on the capabilities of
 the spatial database.  All of the attributes and routines provided by
@@ -929,3 +969,13 @@
 The currently used language code for Norwegian Bokmål ``no`` is being
 replaced by the more common language code ``nb``, which should be updated
 by translators from now on.
+
+.. _1.2-js-assisted-inlines:
+
+JavaScript-assisted handling of inline related objects in the admin app where available
+---------------------------------------------------------------------------------------
+
+When using inline model formsets in the admin app, if the user's browser has
+JavaScript enabled then extra forms controlled by the ``extra``
+``(Stacked|Tabular)Inline`` :ref:`option <ref-contrib-admin-inline-extra>` will
+be hidden and replaced with a link to dynamically add any number of new inlines.
Index: docs/topics/forms/formsets.txt
===================================================================
--- docs/topics/forms/formsets.txt	(revision 13238)
+++ docs/topics/forms/formsets.txt	(working copy)
@@ -68,6 +68,8 @@
 
     :ref:`Creating formsets from models with model formsets <model-formsets>`.
 
+.. _formsets-max-num:
+
 Limiting the maximum number of forms
 ------------------------------------
 
@@ -83,7 +85,7 @@
 
 .. versionchanged:: 1.2
 
-If the value of ``max_num`` is geater than the number of existing related
+If the value of ``max_num`` is geater than the number of existing
 objects, up to ``extra`` additional blank forms will be added to the formset,
 so long as the total number of forms does not exceed ``max_num``.
 
@@ -91,11 +93,6 @@
 forms displayed. Please note that the default value of ``max_num`` was changed
 from ``0`` to ``None`` in version 1.2 to allow ``0`` as a valid value.
 
-.. versionadded:: 1.2
-
-The dynamic "Add Another" link in the Django admin will not appear if
-``max_num`` is less than the number of currently displayed forms.
-
 Formset validation
 ------------------
 
Index: docs/topics/forms/modelforms.txt
===================================================================
--- docs/topics/forms/modelforms.txt	(revision 13238)
+++ docs/topics/forms/modelforms.txt	(working copy)
@@ -661,8 +661,8 @@
 
 .. versionchanged:: 1.2
 
-As with regular formsets, you can use the ``max_num`` parameter to
-``modelformset_factory`` to limit the number of extra forms displayed.
+As with regular formsets, you can use the ``max_num`` and ``extra`` parameters
+to ``modelformset_factory`` to limit the number of extra forms displayed.
 
 ``max_num`` does not prevent existing objects from being displayed::
 
Index: tests/modeltests/model_formsets/models.py
===================================================================
--- tests/modeltests/model_formsets/models.py	(revision 13238)
+++ tests/modeltests/model_formsets/models.py	(working copy)
@@ -368,16 +368,22 @@
 
 >>> AuthorFormSet = modelformset_factory(Author, max_num=None, extra=3)
 >>> formset = AuthorFormSet(queryset=qs)
+>>> len(formset.forms)
+6
 >>> len(formset.extra_forms)
 3
 
 >>> AuthorFormSet = modelformset_factory(Author, max_num=4, extra=3)
 >>> formset = AuthorFormSet(queryset=qs)
+>>> len(formset.forms)
+4
 >>> len(formset.extra_forms)
 1
 
 >>> AuthorFormSet = modelformset_factory(Author, max_num=0, extra=3)
 >>> formset = AuthorFormSet(queryset=qs)
+>>> len(formset.forms)
+3
 >>> len(formset.extra_forms)
 0
 
Index: tests/regressiontests/forms/formsets.py
===================================================================
--- tests/regressiontests/forms/formsets.py	(revision 13238)
+++ tests/regressiontests/forms/formsets.py	(working copy)
@@ -599,6 +599,24 @@
 
 # Base case for max_num.
 
+# When not passed, max_num will take its default value of None, i.e. unlimited
+# number of forms, only controlled by the value of the extra parameter.
+
+>>> LimitedFavoriteDrinkFormSet = formset_factory(FavoriteDrinkForm, extra=3)
+>>> formset = LimitedFavoriteDrinkFormSet()
+>>> for form in formset.forms:
+...     print form
+<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" id="id_form-0-name" /></td></tr>
+<tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" id="id_form-1-name" /></td></tr>
+<tr><th><label for="id_form-2-name">Name:</label></th><td><input type="text" name="form-2-name" id="id_form-2-name" /></td></tr>
+
+# If max_num is 0 then no form is rendered at all.
+
+>>> LimitedFavoriteDrinkFormSet = formset_factory(FavoriteDrinkForm, extra=3, max_num=0)
+>>> formset = LimitedFavoriteDrinkFormSet()
+>>> for form in formset.forms:
+...     print form
+
 >>> LimitedFavoriteDrinkFormSet = formset_factory(FavoriteDrinkForm, extra=5, max_num=2)
 >>> formset = LimitedFavoriteDrinkFormSet()
 >>> for form in formset.forms:
@@ -606,7 +624,7 @@
 <tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" id="id_form-0-name" /></td></tr>
 <tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" id="id_form-1-name" /></td></tr>
 
-# Ensure the that max_num has no affect when extra is less than max_forms.
+# Ensure that max_num has no effect when extra is less than max_num.
 
 >>> LimitedFavoriteDrinkFormSet = formset_factory(FavoriteDrinkForm, extra=1, max_num=2)
 >>> formset = LimitedFavoriteDrinkFormSet()
@@ -616,6 +634,32 @@
 
 # max_num with initial data
 
+# When not passed, max_num will take its default value of None, i.e. unlimited
+# number of forms, only controlled by the values of the initial and extra
+# parameters.
+
+>>> initial = [
+...     {'name': 'Fernet and Coke'},
+... ]
+>>> LimitedFavoriteDrinkFormSet = formset_factory(FavoriteDrinkForm, extra=1)
+>>> formset = LimitedFavoriteDrinkFormSet(initial=initial)
+>>> for form in formset.forms:
+...     print form
+<tr><th><label for="id_form-0-name">Name:</label></th><td><input type="text" name="form-0-name" value="Fernet and Coke" id="id_form-0-name" /></td></tr>
+<tr><th><label for="id_form-1-name">Name:</label></th><td><input type="text" name="form-1-name" id="id_form-1-name" /></td></tr>
+
+# If max_num is 0 then no form is rendered at all, even if extra and initial
+# are specified.
+
+>>> initial = [
+...     {'name': 'Fernet and Coke'},
+...     {'name': 'Bloody Mary'},
+... ]
+>>> LimitedFavoriteDrinkFormSet = formset_factory(FavoriteDrinkForm, extra=1, max_num=0)
+>>> formset = LimitedFavoriteDrinkFormSet(initial=initial)
+>>> for form in formset.forms:
+...     print form
+
 # More initial forms than max_num will result in only the first max_num of
 # them to be displayed with no extra forms.
 
