diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2009-12-16 14:52:29 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2009-12-16 14:52:29 +0000 |
| commit | 680268a6833d5b18c08f2e1d65840f8c12d13249 (patch) | |
| tree | 8a44b5d4708c30914014586e928ed81db7fd1ff0 | |
| parent | 7aaacb589a12e02d2a04edb5afca6c6eac83fc35 (diff) | |
Fixed #10263 -- Added a queryset argument to BaseInlineFormSet, normalizing with BaseModelFormSet, and allowing for custom ordering/subsets in inlines. Thanks to Paulo Scardine for the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@11874 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/forms/models.py | 6 | ||||
| -rw-r--r-- | tests/modeltests/model_formsets/models.py | 47 |
3 files changed, 52 insertions, 2 deletions
@@ -385,6 +385,7 @@ answer newbie questions, and generally made Django that much better: Vinay Sajip <vinay_sajip@yahoo.co.uk> Kadesarin Sanjek Massimo Scamarcia <massimo.scamarcia@gmail.com> + Paulo Scardine <paulo@scardine.com.br> David Schein Bernd Schlapsi schwank@gmail.com diff --git a/django/forms/models.py b/django/forms/models.py index 3f7621e5e7..ca98658748 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -702,7 +702,7 @@ def modelformset_factory(model, form=ModelForm, formfield_callback=lambda f: f.f class BaseInlineFormSet(BaseModelFormSet): """A formset for child objects related to a parent.""" def __init__(self, data=None, files=None, instance=None, - save_as_new=False, prefix=None): + save_as_new=False, prefix=None, queryset=None): from django.db.models.fields.related import RelatedObject if instance is None: self.instance = self.fk.rel.to() @@ -715,7 +715,9 @@ class BaseInlineFormSet(BaseModelFormSet): backlink_value = self.instance else: backlink_value = getattr(self.instance, self.fk.rel.field_name) - qs = self.model._default_manager.filter(**{self.fk.name: backlink_value}) + if queryset is None: + queryset = self.model._default_manager + qs = queryset.filter(**{self.fk.name: backlink_value}) super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix, queryset=qs) diff --git a/tests/modeltests/model_formsets/models.py b/tests/modeltests/model_formsets/models.py index d6f541bfd5..6b70826ab5 100644 --- a/tests/modeltests/model_formsets/models.py +++ b/tests/modeltests/model_formsets/models.py @@ -644,6 +644,53 @@ True >>> formset.save() [<Poem: Brooklyn Bridge>, <Poem: Brooklyn Bridge>] +We can provide a custom queryset to our InlineFormSet: + +>>> custom_qs = queryset=Book.objects.order_by('-title') +>>> formset = AuthorBooksFormSet(instance=author, queryset=custom_qs) +>>> for form in formset.forms: +... print form.as_p() +<p><label for="id_book_set-0-title">Title:</label> <input id="id_book_set-0-title" type="text" name="book_set-0-title" value="Les Fleurs du Mal" maxlength="100" /><input type="hidden" name="book_set-0-author" value="1" id="id_book_set-0-author" /><input type="hidden" name="book_set-0-id" value="1" id="id_book_set-0-id" /></p> +<p><label for="id_book_set-1-title">Title:</label> <input id="id_book_set-1-title" type="text" name="book_set-1-title" value="Le Spleen de Paris" maxlength="100" /><input type="hidden" name="book_set-1-author" value="1" id="id_book_set-1-author" /><input type="hidden" name="book_set-1-id" value="2" id="id_book_set-1-id" /></p> +<p><label for="id_book_set-2-title">Title:</label> <input id="id_book_set-2-title" type="text" name="book_set-2-title" value="Flowers of Evil" maxlength="100" /><input type="hidden" name="book_set-2-author" value="1" id="id_book_set-2-author" /><input type="hidden" name="book_set-2-id" value="5" id="id_book_set-2-id" /></p> +<p><label for="id_book_set-3-title">Title:</label> <input id="id_book_set-3-title" type="text" name="book_set-3-title" maxlength="100" /><input type="hidden" name="book_set-3-author" value="1" id="id_book_set-3-author" /><input type="hidden" name="book_set-3-id" id="id_book_set-3-id" /></p> +<p><label for="id_book_set-4-title">Title:</label> <input id="id_book_set-4-title" type="text" name="book_set-4-title" maxlength="100" /><input type="hidden" name="book_set-4-author" value="1" id="id_book_set-4-author" /><input type="hidden" name="book_set-4-id" id="id_book_set-4-id" /></p> + +>>> data = { +... 'book_set-TOTAL_FORMS': '5', # the number of forms rendered +... 'book_set-INITIAL_FORMS': '3', # the number of forms with initial data +... 'book_set-0-id': '1', +... 'book_set-0-title': 'Les Fleurs du Mal', +... 'book_set-1-id': '2', +... 'book_set-1-title': 'Le Spleen de Paris', +... 'book_set-2-id': '5', +... 'book_set-2-title': 'Flowers of Evil', +... 'book_set-3-title': 'Revue des deux mondes', +... 'book_set-4-title': '', +... } +>>> formset = AuthorBooksFormSet(data, instance=author, queryset=custom_qs) +>>> formset.is_valid() +True + +>>> custom_qs = queryset=Book.objects.filter(title__startswith='F') +>>> formset = AuthorBooksFormSet(instance=author, queryset=custom_qs) +>>> for form in formset.forms: +... print form.as_p() +<p><label for="id_book_set-0-title">Title:</label> <input id="id_book_set-0-title" type="text" name="book_set-0-title" value="Flowers of Evil" maxlength="100" /><input type="hidden" name="book_set-0-author" value="1" id="id_book_set-0-author" /><input type="hidden" name="book_set-0-id" value="5" id="id_book_set-0-id" /></p> +<p><label for="id_book_set-1-title">Title:</label> <input id="id_book_set-1-title" type="text" name="book_set-1-title" maxlength="100" /><input type="hidden" name="book_set-1-author" value="1" id="id_book_set-1-author" /><input type="hidden" name="book_set-1-id" id="id_book_set-1-id" /></p> +<p><label for="id_book_set-2-title">Title:</label> <input id="id_book_set-2-title" type="text" name="book_set-2-title" maxlength="100" /><input type="hidden" name="book_set-2-author" value="1" id="id_book_set-2-author" /><input type="hidden" name="book_set-2-id" id="id_book_set-2-id" /></p> +>>> data = { +... 'book_set-TOTAL_FORMS': '3', # the number of forms rendered +... 'book_set-INITIAL_FORMS': '1', # the number of forms with initial data +... 'book_set-0-id': '5', +... 'book_set-0-title': 'Flowers of Evil', +... 'book_set-1-title': 'Revue des deux mondes', +... 'book_set-2-title': '', +... } +>>> formset = AuthorBooksFormSet(data, instance=author, queryset=custom_qs) +>>> formset.is_valid() +True + # Test a custom primary key ################################################### |
