mirror of
https://github.com/django/django.git
synced 2025-08-03 18:38:50 +00:00
Fixed #13023 - Removed ambiguity with regard to the max_num option of formsets and as a result of admin inlines. Thanks to Gabriel Hurley for the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12872 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
9df8d9c294
commit
aba95dcc0b
13 changed files with 138 additions and 88 deletions
|
@ -71,7 +71,7 @@ Limiting the maximum number of forms
|
|||
------------------------------------
|
||||
|
||||
The ``max_num`` parameter to ``formset_factory`` gives you the ability to
|
||||
force the maximum number of forms the formset will display::
|
||||
limit the maximum number of empty forms the formset will display::
|
||||
|
||||
>>> ArticleFormSet = formset_factory(ArticleForm, extra=2, max_num=1)
|
||||
>>> formset = ArticleFormset()
|
||||
|
@ -80,8 +80,20 @@ force the maximum number of forms the formset will display::
|
|||
<tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr>
|
||||
<tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr>
|
||||
|
||||
A ``max_num`` value of ``0`` (the default) puts no limit on the number forms
|
||||
displayed.
|
||||
.. versionchanged:: 1.2
|
||||
|
||||
If the value of ``max_num`` is geater than the number of existing related
|
||||
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``.
|
||||
|
||||
A ``max_num`` value of ``None`` (the default) puts no limit on the number of
|
||||
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
|
||||
------------------
|
||||
|
@ -102,7 +114,7 @@ provide an invalid article::
|
|||
>>> data = {
|
||||
... 'form-TOTAL_FORMS': u'2',
|
||||
... 'form-INITIAL_FORMS': u'0',
|
||||
... 'form-MAX_NUM_FORMS': u'0',
|
||||
... 'form-MAX_NUM_FORMS': u'',
|
||||
... 'form-0-title': u'Test',
|
||||
... 'form-0-pub_date': u'16 June 1904',
|
||||
... 'form-1-title': u'Test',
|
||||
|
@ -190,7 +202,7 @@ is where you define your own validation that works at the formset level::
|
|||
>>> data = {
|
||||
... 'form-TOTAL_FORMS': u'2',
|
||||
... 'form-INITIAL_FORMS': u'0',
|
||||
... 'form-MAX_NUM_FORMS': u'0',
|
||||
... 'form-MAX_NUM_FORMS': u'',
|
||||
... 'form-0-title': u'Test',
|
||||
... 'form-0-pub_date': u'16 June 1904',
|
||||
... 'form-1-title': u'Test',
|
||||
|
@ -249,7 +261,7 @@ happen when the user changes these values::
|
|||
>>> data = {
|
||||
... 'form-TOTAL_FORMS': u'3',
|
||||
... 'form-INITIAL_FORMS': u'2',
|
||||
... 'form-MAX_NUM_FORMS': u'0',
|
||||
... 'form-MAX_NUM_FORMS': u'',
|
||||
... 'form-0-title': u'Article #1',
|
||||
... 'form-0-pub_date': u'2008-05-10',
|
||||
... 'form-0-ORDER': u'2',
|
||||
|
@ -287,7 +299,7 @@ Lets create a formset with the ability to delete::
|
|||
... ])
|
||||
>>> for form in formset.forms:
|
||||
.... print form.as_table()
|
||||
<input type="hidden" name="form-TOTAL_FORMS" value="3" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="2" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" value="0" id="id_form-MAX_NUM_FORMS" />
|
||||
<input type="hidden" name="form-TOTAL_FORMS" value="3" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="2" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS" />
|
||||
<tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title" /></td></tr>
|
||||
<tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date" /></td></tr>
|
||||
<tr><th><label for="id_form-0-DELETE">Delete:</label></th><td><input type="checkbox" name="form-0-DELETE" id="id_form-0-DELETE" /></td></tr>
|
||||
|
@ -305,7 +317,7 @@ delete fields you can access them with ``deleted_forms``::
|
|||
>>> data = {
|
||||
... 'form-TOTAL_FORMS': u'3',
|
||||
... 'form-INITIAL_FORMS': u'2',
|
||||
... 'form-MAX_NUM_FORMS': u'0',
|
||||
... 'form-MAX_NUM_FORMS': u'',
|
||||
... 'form-0-title': u'Article #1',
|
||||
... 'form-0-pub_date': u'2008-05-10',
|
||||
... 'form-0-DELETE': u'on',
|
||||
|
|
|
@ -369,7 +369,7 @@ Overriding the default field types or widgets
|
|||
The default field types, as described in the `Field types`_ table above, are
|
||||
sensible defaults. If you have a ``DateField`` in your model, chances are you'd
|
||||
want that to be represented as a ``DateField`` in your form. But
|
||||
``ModelForm`` gives you the flexibility of changing the form field type and
|
||||
``ModelForm`` gives you the flexibility of changing the form field type and
|
||||
widget for a given model field.
|
||||
|
||||
To specify a custom widget for a field, use the ``widgets`` attribute of the
|
||||
|
@ -401,7 +401,7 @@ field, you could do the following::
|
|||
|
||||
class ArticleForm(ModelForm):
|
||||
pub_date = MyDateFormField()
|
||||
|
||||
|
||||
class Meta:
|
||||
model = Article
|
||||
|
||||
|
@ -557,7 +557,7 @@ with the ``Author`` model. It works just like a regular formset::
|
|||
|
||||
>>> formset = AuthorFormSet()
|
||||
>>> print formset
|
||||
<input type="hidden" name="form-TOTAL_FORMS" value="1" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="0" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" value="0" id="id_form-MAX_NUM_FORMS" />
|
||||
<input type="hidden" name="form-TOTAL_FORMS" value="1" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="0" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS" />
|
||||
<tr><th><label for="id_form-0-name">Name:</label></th><td><input id="id_form-0-name" type="text" name="form-0-name" maxlength="100" /></td></tr>
|
||||
<tr><th><label for="id_form-0-title">Title:</label></th><td><select name="form-0-title" id="id_form-0-title">
|
||||
<option value="" selected="selected">---------</option>
|
||||
|
@ -653,22 +653,24 @@ are saved properly.
|
|||
Limiting the number of editable objects
|
||||
---------------------------------------
|
||||
|
||||
.. versionchanged:: 1.2
|
||||
|
||||
As with regular formsets, you can use the ``max_num`` parameter to
|
||||
``modelformset_factory`` to limit the number of forms displayed. With
|
||||
model formsets, this property limits the query to select only the maximum
|
||||
number of objects needed::
|
||||
``modelformset_factory`` to limit the number of extra forms displayed.
|
||||
|
||||
``max_num`` does not prevent existing objects from being displayed::
|
||||
|
||||
>>> Author.objects.order_by('name')
|
||||
[<Author: Charles Baudelaire>, <Author: Paul Verlaine>, <Author: Walt Whitman>]
|
||||
|
||||
>>> AuthorFormSet = modelformset_factory(Author, max_num=2, extra=1)
|
||||
>>> AuthorFormSet = modelformset_factory(Author, max_num=1)
|
||||
>>> formset = AuthorFormSet(queryset=Author.objects.order_by('name'))
|
||||
>>> formset.initial
|
||||
[{'id': 1, 'name': u'Charles Baudelaire'}, {'id': 3, 'name': u'Paul Verlaine'}]
|
||||
>>> [x.name for x in formset.get_queryset()]
|
||||
[u'Charles Baudelaire', u'Paul Verlaine', u'Walt Whitman']
|
||||
|
||||
If the value of ``max_num`` is higher than the number of objects returned, 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``::
|
||||
If the value of ``max_num`` is geater than the number of existing related
|
||||
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``::
|
||||
|
||||
>>> AuthorFormSet = modelformset_factory(Author, max_num=4, extra=2)
|
||||
>>> formset = AuthorFormSet(queryset=Author.objects.order_by('name'))
|
||||
|
@ -679,6 +681,11 @@ total number of forms does not exceed ``max_num``::
|
|||
<tr><th><label for="id_form-2-name">Name:</label></th><td><input id="id_form-2-name" type="text" name="form-2-name" value="Walt Whitman" maxlength="100" /><input type="hidden" name="form-2-id" value="2" id="id_form-2-id" /></td></tr>
|
||||
<tr><th><label for="id_form-3-name">Name:</label></th><td><input id="id_form-3-name" type="text" name="form-3-name" maxlength="100" /><input type="hidden" name="form-3-id" id="id_form-3-id" /></td></tr>
|
||||
|
||||
.. versionchanged:: 1.2
|
||||
|
||||
A ``max_num`` value of ``None`` (the default) puts no limit on the number of
|
||||
forms displayed.
|
||||
|
||||
Using a model formset in a view
|
||||
-------------------------------
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue