mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #21361 -- allowed access self.value() from SimpleListFilter lookup
Reviewed by Chris Medrela.
This commit is contained in:
		
				
					committed by
					
						 Anssi Kääriäinen
						Anssi Kääriäinen
					
				
			
			
				
	
			
			
			
						parent
						
							4fdd51b732
						
					
				
				
					commit
					68b540c977
				
			| @@ -67,13 +67,13 @@ class SimpleListFilter(ListFilter): | ||||
|             raise ImproperlyConfigured( | ||||
|                 "The list filter '%s' does not specify " | ||||
|                 "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) | ||||
|         if lookup_choices is None: | ||||
|             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): | ||||
|         return len(self.lookup_choices) > 0 | ||||
|   | ||||
| @@ -106,6 +106,17 @@ class DepartmentListFilterLookupWithUnderscoredParameter(DepartmentListFilterLoo | ||||
|     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): | ||||
|     list_filter = ('books_authored', 'books_contributed') | ||||
|  | ||||
| @@ -169,6 +180,10 @@ class DepartmentFilterUnderscoredEmployeeAdmin(EmployeeAdmin): | ||||
|     list_filter = [DepartmentListFilterLookupWithUnderscoredParameter, ] | ||||
|  | ||||
|  | ||||
| class DepartmentFilterDynamicValueBookAdmin(EmployeeAdmin): | ||||
|     list_filter = [DepartmentListFilterLookupWithDynamicValue, ] | ||||
|  | ||||
|  | ||||
| class ListFiltersTests(TestCase): | ||||
|  | ||||
|     def setUp(self): | ||||
| @@ -816,3 +831,25 @@ class ListFiltersTests(TestCase): | ||||
|         self.assertEqual(choices[2]['display'], 'Design') | ||||
|         self.assertEqual(choices[2]['selected'], False) | ||||
|         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")) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user