Code

Ticket #10263: inline_formset_queryset_argument.diff

File inline_formset_queryset_argument.diff, 5.6 KB (added by paulos, 5 years ago)

New patch as sugested by Alex

Line 
1Index: django-trunk/django/forms/models.py
2===================================================================
3--- django-trunk/django/forms/models.py (revision 9962)
4+++ django-trunk/django/forms/models.py (working copy)
5@@ -462,7 +462,7 @@
6 class BaseInlineFormSet(BaseModelFormSet):
7     """A formset for child objects related to a parent."""
8     def __init__(self, data=None, files=None, instance=None,
9-                 save_as_new=False, prefix=None):
10+                 save_as_new=False, prefix=None, queryset=None):
11         from django.db.models.fields.related import RelatedObject
12         if instance is None:
13             self.instance = self.model()
14@@ -471,7 +471,10 @@
15         self.save_as_new = save_as_new
16         # is there a better way to get the object descriptor?
17         self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
18-        qs = self.model._default_manager.filter(**{self.fk.name: self.instance})
19+        if queryset:
20+            qs = queryset
21+        else:
22+            qs = self.model._default_manager.filter(**{self.fk.name: self.instance})
23         super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix or self.rel_name,
24                                                 queryset=qs)
25 
26Index: django-trunk/tests/modeltests/model_formsets/models.py
27===================================================================
28--- django-trunk/tests/modeltests/model_formsets/models.py      (revision 9962)
29+++ django-trunk/tests/modeltests/model_formsets/models.py      (working copy)
30@@ -552,7 +552,48 @@
31 >>> formset.save()
32 [<AlternateBook: Flowers of Evil - English translation of Les Fleurs du Mal>]
33 
34+We can provide a custom queryset to our InlineFormSet:
35 
36+>>> custom_qs = queryset=Book.objects.filter(author=author).order_by('-title')
37+>>> formset = AuthorBooksFormSet(instance=author, queryset=custom_qs)
38+>>> for form in formset.forms:
39+...     print form.as_p()
40+<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>
41+<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>
42+<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>
43+<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>
44+<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>
45+>>> data = {
46+...     'book_set-TOTAL_FORMS': '5', # the number of forms rendered
47+...     'book_set-INITIAL_FORMS': '3', # the number of forms with initial data
48+...     'book_set-0-title': 'Les Fleurs du Mal',
49+...     'book_set-1-title': 'Le Spleen de Paris',
50+...     'book_set-2-title': 'Flowers of Evil',
51+...     'book_set-3-title': 'Revue des deux mondes',
52+...     'book_set-4-title': '',
53+... }
54+>>> formset = AuthorBooksFormSet(data, instance=author, queryset=custom_qs)
55+>>> formset.is_valid()
56+True
57+>>> custom_qs = queryset=Book.objects.filter(author=author, title__startswith='F')
58+>>> formset = AuthorBooksFormSet(instance=author, queryset=custom_qs)
59+>>> for form in formset.forms:
60+...     print form.as_p()
61+<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>
62+<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>
63+<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>
64+>>> data = {
65+...     'book_set-TOTAL_FORMS': '3', # the number of forms rendered
66+...     'book_set-INITIAL_FORMS': '1', # the number of forms with initial data
67+...     'book_set-0-title': 'Flowers of Evil',
68+...     'book_set-1-title': 'Revue des deux mondes',
69+...     'book_set-2-title': '',
70+... }
71+>>> formset = AuthorBooksFormSet(data, instance=author, queryset=custom_qs)
72+>>> formset.is_valid()
73+True
74+
75+
76 # Test a custom primary key ###################################################
77 
78 We need to ensure that it is displayed