diff --git a/django/contrib/admin/filters.py b/django/contrib/admin/filters.py index 9dbd8a8f26..b35460ce7d 100644 --- a/django/contrib/admin/filters.py +++ b/django/contrib/admin/filters.py @@ -132,7 +132,9 @@ class FieldListFilter(ListFilter): def queryset(self, request, queryset): try: return queryset.filter(**self.used_parameters) - except ValidationError as e: + except (ValueError, ValidationError) as e: + # Fields may raise a ValueError or ValidationError when converting + # the parameters to the correct type. raise IncorrectLookupParameters(e) @classmethod diff --git a/docs/releases/1.11.3.txt b/docs/releases/1.11.3.txt index f273a36e9f..5b3b1066a9 100644 --- a/docs/releases/1.11.3.txt +++ b/docs/releases/1.11.3.txt @@ -18,3 +18,6 @@ Bugfixes * Fixed an incorrect ``DisallowedModelAdminLookup`` exception when using a nested reverse relation in ``list_filter`` (:ticket:`28262`). + +* Fixed admin's ``FieldListFilter.get_queryset()`` crash on invalid input + (:ticket:`28202`). diff --git a/tests/admin_filters/tests.py b/tests/admin_filters/tests.py index 3f2f33bf3c..06b795b2db 100644 --- a/tests/admin_filters/tests.py +++ b/tests/admin_filters/tests.py @@ -6,6 +6,7 @@ from django.contrib.admin import ( AllValuesFieldListFilter, BooleanFieldListFilter, ModelAdmin, RelatedOnlyFieldListFilter, SimpleListFilter, site, ) +from django.contrib.admin.options import IncorrectLookupParameters from django.contrib.admin.views.main import ChangeList from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User @@ -763,6 +764,13 @@ class ListFiltersTests(TestCase): queryset = changelist.get_queryset(request) self.assertEqual(list(queryset), [self.bio_book, self.djangonaut_book]) + def test_fieldlistfilter_invalid_lookup_parameters(self): + """Filtering by an invalid value.""" + modeladmin = BookAdmin(Book, site) + request = self.request_factory.get('/', {'author__id__exact': 'StringNotInteger!'}) + with self.assertRaises(IncorrectLookupParameters): + self.get_changelist(request, Book, modeladmin) + def test_simplelistfilter(self): modeladmin = DecadeFilterBookAdmin(Book, site) diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py index 7c3190574c..cd323a10cf 100644 --- a/tests/admin_views/admin.py +++ b/tests/admin_views/admin.py @@ -165,7 +165,7 @@ class CustomArticleAdmin(admin.ModelAdmin): class ThingAdmin(admin.ModelAdmin): - list_filter = ('color__warm', 'color__value', 'pub_date',) + list_filter = ('color', 'color__warm', 'color__value', 'pub_date') class InquisitionAdmin(admin.ModelAdmin):