Fixed #21361 -- allowed access self.value() from SimpleListFilter lookup
Reviewed by Chris Medrela.
This commit is contained in:
parent
4fdd51b732
commit
68b540c977
|
@ -67,13 +67,13 @@ class SimpleListFilter(ListFilter):
|
||||||
raise ImproperlyConfigured(
|
raise ImproperlyConfigured(
|
||||||
"The list filter '%s' does not specify "
|
"The list filter '%s' does not specify "
|
||||||
"a 'parameter_name'." % self.__class__.__name__)
|
"a 'parameter_name'." % self.__class__.__name__)
|
||||||
|
if self.parameter_name in params:
|
||||||
|
value = params.pop(self.parameter_name)
|
||||||
|
self.used_parameters[self.parameter_name] = value
|
||||||
lookup_choices = self.lookups(request, model_admin)
|
lookup_choices = self.lookups(request, model_admin)
|
||||||
if lookup_choices is None:
|
if lookup_choices is None:
|
||||||
lookup_choices = ()
|
lookup_choices = ()
|
||||||
self.lookup_choices = list(lookup_choices)
|
self.lookup_choices = list(lookup_choices)
|
||||||
if self.parameter_name in params:
|
|
||||||
value = params.pop(self.parameter_name)
|
|
||||||
self.used_parameters[self.parameter_name] = value
|
|
||||||
|
|
||||||
def has_output(self):
|
def has_output(self):
|
||||||
return len(self.lookup_choices) > 0
|
return len(self.lookup_choices) > 0
|
||||||
|
|
|
@ -106,6 +106,17 @@ class DepartmentListFilterLookupWithUnderscoredParameter(DepartmentListFilterLoo
|
||||||
parameter_name = 'department__whatever'
|
parameter_name = 'department__whatever'
|
||||||
|
|
||||||
|
|
||||||
|
class DepartmentListFilterLookupWithDynamicValue(DecadeListFilterWithTitleAndParameter):
|
||||||
|
|
||||||
|
def lookups(self, request, model_admin):
|
||||||
|
if self.value() == 'the 80s':
|
||||||
|
return (('the 90s', "the 1990's"),)
|
||||||
|
elif self.value() == 'the 90s':
|
||||||
|
return (('the 80s', "the 1980's"),)
|
||||||
|
else:
|
||||||
|
return (('the 80s', "the 1980's"), ('the 90s', "the 1990's"),)
|
||||||
|
|
||||||
|
|
||||||
class CustomUserAdmin(UserAdmin):
|
class CustomUserAdmin(UserAdmin):
|
||||||
list_filter = ('books_authored', 'books_contributed')
|
list_filter = ('books_authored', 'books_contributed')
|
||||||
|
|
||||||
|
@ -169,6 +180,10 @@ class DepartmentFilterUnderscoredEmployeeAdmin(EmployeeAdmin):
|
||||||
list_filter = [DepartmentListFilterLookupWithUnderscoredParameter, ]
|
list_filter = [DepartmentListFilterLookupWithUnderscoredParameter, ]
|
||||||
|
|
||||||
|
|
||||||
|
class DepartmentFilterDynamicValueBookAdmin(EmployeeAdmin):
|
||||||
|
list_filter = [DepartmentListFilterLookupWithDynamicValue, ]
|
||||||
|
|
||||||
|
|
||||||
class ListFiltersTests(TestCase):
|
class ListFiltersTests(TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -816,3 +831,25 @@ class ListFiltersTests(TestCase):
|
||||||
self.assertEqual(choices[2]['display'], 'Design')
|
self.assertEqual(choices[2]['display'], 'Design')
|
||||||
self.assertEqual(choices[2]['selected'], False)
|
self.assertEqual(choices[2]['selected'], False)
|
||||||
self.assertEqual(choices[2]['query_string'], '?department__code__exact=DSN')
|
self.assertEqual(choices[2]['query_string'], '?department__code__exact=DSN')
|
||||||
|
|
||||||
|
def test_lookup_with_dynamic_value(self):
|
||||||
|
"""
|
||||||
|
Ensure SimpleListFilter can access self.value() inside the lookup.
|
||||||
|
"""
|
||||||
|
modeladmin = DepartmentFilterDynamicValueBookAdmin(Book, site)
|
||||||
|
|
||||||
|
def _test_choices(request, expected_displays):
|
||||||
|
changelist = self.get_changelist(request, Book, modeladmin)
|
||||||
|
filterspec = changelist.get_filters(request)[0][0]
|
||||||
|
self.assertEqual(force_text(filterspec.title), 'publication decade')
|
||||||
|
choices = tuple(c['display'] for c in filterspec.choices(changelist))
|
||||||
|
self.assertEqual(choices, expected_displays)
|
||||||
|
|
||||||
|
_test_choices(self.request_factory.get('/', {}),
|
||||||
|
("All", "the 1980's", "the 1990's"))
|
||||||
|
|
||||||
|
_test_choices(self.request_factory.get('/', {'publication-decade': 'the 80s'}),
|
||||||
|
("All", "the 1990's"))
|
||||||
|
|
||||||
|
_test_choices(self.request_factory.get('/', {'publication-decade': 'the 90s'}),
|
||||||
|
("All", "the 1980's"))
|
||||||
|
|
Loading…
Reference in New Issue