Fixed #23055 -- Made generic admin filter obey ModelAdmin queryset.

Thanks to Trac user synasius and to Ola Sitarska for helping in
identifying the issue and helping with the test case.
This commit is contained in:
Ramiro Morales 2014-08-28 17:15:18 -03:00
parent df251e033c
commit 3a297d7816
2 changed files with 34 additions and 1 deletions

View File

@ -364,7 +364,12 @@ class AllValuesFieldListFilter(FieldListFilter):
self.lookup_val_isnull = request.GET.get(self.lookup_kwarg_isnull, self.lookup_val_isnull = request.GET.get(self.lookup_kwarg_isnull,
None) None)
parent_model, reverse_path = reverse_field_path(model, field_path) parent_model, reverse_path = reverse_field_path(model, field_path)
queryset = parent_model._default_manager.all() # Obey parent ModelAdmin queryset when deciding which options to show
if model == parent_model:
queryset = model_admin.get_queryset(request)
else:
queryset = parent_model._default_manager.all()
# optional feature: limit choices base on existing relationships # optional feature: limit choices base on existing relationships
# queryset = queryset.complex_filter( # queryset = queryset.complex_filter(
# {'%s__isnull' % reverse_path: False}) # {'%s__isnull' % reverse_path: False})

View File

@ -134,6 +134,18 @@ class BookAdminWithUnderscoreLookupAndTuple(BookAdmin):
list_filter = ('year', ('author__email', AllValuesFieldListFilter), 'contributors', 'is_best_seller', 'date_registered', 'no') list_filter = ('year', ('author__email', AllValuesFieldListFilter), 'contributors', 'is_best_seller', 'date_registered', 'no')
class BookAdminWithCustomQueryset(ModelAdmin):
def __init__(self, user, *args, **kwargs):
self.user = user
super(BookAdminWithCustomQueryset, self).__init__(*args, **kwargs)
list_filter = ('year',)
def get_queryset(self, request):
return super(BookAdminWithCustomQueryset, self).get_queryset(request).filter(author=self.user)
class BookAdminRelatedOnlyFilter(ModelAdmin): class BookAdminRelatedOnlyFilter(ModelAdmin):
list_filter = ( list_filter = (
'year', 'is_best_seller', 'date_registered', 'no', 'year', 'is_best_seller', 'date_registered', 'no',
@ -365,6 +377,22 @@ class ListFiltersTests(TestCase):
self.assertEqual(choices[2]['selected'], True) self.assertEqual(choices[2]['selected'], True)
self.assertEqual(choices[2]['query_string'], '?year=2002') self.assertEqual(choices[2]['query_string'], '?year=2002')
def test_allvaluesfieldlistfilter_custom_qs(self):
# Make sure that correct filters are returned with custom querysets
modeladmin = BookAdminWithCustomQueryset(self.alfred, Book, site)
request = self.request_factory.get('/')
changelist = self.get_changelist(request, Book, modeladmin)
filterspec = changelist.get_filters(request)[0][0]
choices = list(filterspec.choices(changelist))
# Should have 'All', 1999 and 2009 options i.e. the subset of years of
# books written by alfred (which is the filtering criteria set by
# BookAdminWithCustomQueryset.get_queryset())
self.assertEqual(3, len(choices))
self.assertEqual(choices[0]['query_string'], '?')
self.assertEqual(choices[1]['query_string'], '?year=1999')
self.assertEqual(choices[2]['query_string'], '?year=2009')
def test_relatedfieldlistfilter_foreignkey(self): def test_relatedfieldlistfilter_foreignkey(self):
modeladmin = BookAdmin(Book, site) modeladmin = BookAdmin(Book, site)