mirror of https://github.com/django/django.git
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:
parent
df251e033c
commit
3a297d7816
|
@ -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})
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue