diff --git a/django/contrib/admin/filters.py b/django/contrib/admin/filters.py index 08d34831cbc..1bdd6372242 100644 --- a/django/contrib/admin/filters.py +++ b/django/contrib/admin/filters.py @@ -364,7 +364,12 @@ class AllValuesFieldListFilter(FieldListFilter): self.lookup_val_isnull = request.GET.get(self.lookup_kwarg_isnull, None) 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 # queryset = queryset.complex_filter( # {'%s__isnull' % reverse_path: False}) diff --git a/tests/admin_filters/tests.py b/tests/admin_filters/tests.py index fcd7038687a..294793e7491 100644 --- a/tests/admin_filters/tests.py +++ b/tests/admin_filters/tests.py @@ -134,6 +134,18 @@ class BookAdminWithUnderscoreLookupAndTuple(BookAdmin): 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): list_filter = ( 'year', 'is_best_seller', 'date_registered', 'no', @@ -365,6 +377,22 @@ class ListFiltersTests(TestCase): self.assertEqual(choices[2]['selected'], True) 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): modeladmin = BookAdmin(Book, site)