Author: russellm
Date: 2009-12-16 08:53:42 -0600 (Wed, 16 Dec 2009)
New Revision: 11875

Modified:
   django/branches/releases/1.1.X/AUTHORS
   django/branches/releases/1.1.X/django/forms/models.py
   django/branches/releases/1.1.X/tests/modeltests/model_formsets/models.py
Log:
[1.1.X] 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.

Backport of r11874 from trunk.

Modified: django/branches/releases/1.1.X/AUTHORS
===================================================================
--- django/branches/releases/1.1.X/AUTHORS      2009-12-16 14:52:29 UTC (rev 
11874)
+++ django/branches/releases/1.1.X/AUTHORS      2009-12-16 14:53:42 UTC (rev 
11875)
@@ -380,6 +380,7 @@
     Vinay Sajip <[email protected]>
     Kadesarin Sanjek
     Massimo Scamarcia <[email protected]>
+    Paulo Scardine <[email protected]>
     David Schein
     Bernd Schlapsi
     [email protected]

Modified: django/branches/releases/1.1.X/django/forms/models.py
===================================================================
--- django/branches/releases/1.1.X/django/forms/models.py       2009-12-16 
14:52:29 UTC (rev 11874)
+++ django/branches/releases/1.1.X/django/forms/models.py       2009-12-16 
14:53:42 UTC (rev 11875)
@@ -706,7 +706,7 @@
 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()
@@ -719,7 +719,9 @@
             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)
 

Modified: 
django/branches/releases/1.1.X/tests/modeltests/model_formsets/models.py
===================================================================
--- django/branches/releases/1.1.X/tests/modeltests/model_formsets/models.py    
2009-12-16 14:52:29 UTC (rev 11874)
+++ django/branches/releases/1.1.X/tests/modeltests/model_formsets/models.py    
2009-12-16 14:53:42 UTC (rev 11875)
@@ -644,7 +644,54 @@
 >>> 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 ###################################################
 
 We need to ensure that it is displayed

--

You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.


Reply via email to