From e5b0f5b95d49c33f5431cf4060705b5e59ec69d4 Mon Sep 17 00:00:00 2001
From: tschilling <schillingt@better-simple.com>
Date: Wed, 25 Sep 2013 17:00:51 -0400
Subject: [PATCH] [1.6.x] Fixed #21129 -- Prevented admin filter params
 modifications from throwing an exception.

Thanks Tuttle for the report.

Backport of 5381317fe3 from master
---
 django/contrib/admin/options.py |  4 ++++
 tests/modeladmin/tests.py       | 12 ++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 8c88506a15..a841ee30b9 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -306,6 +306,10 @@ class BaseModelAdmin(six.with_metaclass(RenameBaseModelAdminMethods)):
                 # later.
                 return True
             if hasattr(field, 'rel'):
+                if field.rel is None:
+                    # This property or relation doesn't exist, but it's allowed
+                    # since it's ignored in ChangeList.get_filters().
+                    return True
                 model = field.rel.to
                 rel_name = field.rel.get_related_field().name
             elif isinstance(field, RelatedObject):
diff --git a/tests/modeladmin/tests.py b/tests/modeladmin/tests.py
index 805b57c070..ffc6219ebb 100644
--- a/tests/modeladmin/tests.py
+++ b/tests/modeladmin/tests.py
@@ -88,6 +88,18 @@ class ModelAdminTests(TestCase):
         form = ma.get_formset(None).form
         self.assertEqual(form._meta.fields, ['day', 'transport'])
 
+    def test_lookup_allowed_allows_nonexistent_lookup(self):
+        """
+        Ensure that a lookup_allowed allows a parameter
+        whose field lookup doesn't exist.
+        Refs #21129.
+        """
+        class BandAdmin(ModelAdmin):
+            fields = ['name']
+
+        ma = BandAdmin(Band, self.site)
+        self.assertTrue(ma.lookup_allowed('name__nonexistent', 'test_value'))
+
     def test_field_arguments(self):
         # If we specify the fields argument, fieldsets_add and fielsets_change should
         # just stick the fields into a formsets structure and return it.