Просмотр исходного кода

[5.0.x] Fixed #35087 -- Reallowed filtering against foreign keys not listed in ModelAdmin.list_filters.

Regression in f80669d2f5a5f1db9e9b73ca893fefba34f955e7.

Backport of a9094ec1f43dca7f2a649327afcd5e6226b4959c from main
Sarah Boyce 1 год назад
Родитель
Сommit
4cba6748a6
3 измененных файлов с 20 добавлено и 3 удалено
  1. 3 2
      django/contrib/admin/options.py
  2. 3 1
      docs/releases/5.0.2.txt
  3. 14 0
      tests/modeladmin/tests.py

+ 3 - 2
django/contrib/admin/options.py

@@ -465,7 +465,8 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
 
         relation_parts = []
         prev_field = None
-        for part in lookup.split(LOOKUP_SEP):
+        parts = lookup.split(LOOKUP_SEP)
+        for part in parts:
             try:
                 field = model._meta.get_field(part)
             except FieldDoesNotExist:
@@ -489,7 +490,7 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
             prev_field = field
             model = field.path_infos[-1].to_opts.model
 
-        if not relation_parts:
+        if not relation_parts or len(parts) == 1:
             # Either a local field filter, or no fields at all.
             return True
         valid_lookups = {self.date_hierarchy}

+ 3 - 1
docs/releases/5.0.2.txt

@@ -9,4 +9,6 @@ Django 5.0.2 fixes several bugs in 5.0.1.
 Bugfixes
 ========
 
-* ...
+* Reallowed, following a regression in Django 5.0.1, filtering against local
+  foreign keys not included in :attr:`.ModelAdmin.list_filter`
+  (:ticket:`35087`).

+ 14 - 0
tests/modeladmin/tests.py

@@ -162,6 +162,20 @@ class ModelAdminTests(TestCase):
             True,
         )
 
+    @isolate_apps("modeladmin")
+    def test_lookup_allowed_for_local_fk_fields(self):
+        class Country(models.Model):
+            pass
+
+        class Place(models.Model):
+            country = models.ForeignKey(Country, models.CASCADE)
+
+        class PlaceAdmin(ModelAdmin):
+            pass
+
+        ma = PlaceAdmin(Place, self.site)
+        self.assertIs(ma.lookup_allowed("country", "1", request), True)
+
     @isolate_apps("modeladmin")
     def test_lookup_allowed_non_autofield_primary_key(self):
         class Country(models.Model):