summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/contrib/admin/views/main.py7
-rw-r--r--tests/regressiontests/admin_views/models.py2
-rw-r--r--tests/regressiontests/admin_views/tests.py10
3 files changed, 18 insertions, 1 deletions
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index df0fd9fab4..d34bb1b195 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -185,6 +185,13 @@ class ChangeList(object):
if key.endswith('__in'):
lookup_params[key] = value.split(',')
+ # if key ends with __isnull, special case '' and false
+ if key.endswith('__isnull'):
+ if value.lower() in ('', 'false'):
+ lookup_params[key] = False
+ else:
+ lookup_params[key] = True
+
# Apply lookup parameters from the query string.
try:
qs = qs.filter(**lookup_params)
diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py
index a761cdd078..0caa8946c1 100644
--- a/tests/regressiontests/admin_views/models.py
+++ b/tests/regressiontests/admin_views/models.py
@@ -26,7 +26,7 @@ class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date = models.DateTimeField()
- section = models.ForeignKey(Section)
+ section = models.ForeignKey(Section, null=True, blank=True)
def __unicode__(self):
return self.title
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index 8ab0ed4817..756cb18f4d 100644
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -216,6 +216,16 @@ class AdminViewBasicTest(TestCase):
response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'color__id__exact': 'StringNotInteger!'})
self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit)
+ def testIsNullLookups(self):
+ """Ensure is_null is handled correctly."""
+ Article.objects.create(title="I Could Go Anywhere", content="Versatile", date=datetime.datetime.now())
+ response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit)
+ self.failUnless('4 articles' in response.content, '"4 articles" missing from response')
+ response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': 'false'})
+ self.failUnless('3 articles' in response.content, '"3 articles" missing from response')
+ response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': 'true'})
+ self.failUnless('1 article' in response.content, '"1 article" missing from response')
+
def testLogoutAndPasswordChangeURLs(self):
response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit)
self.failIf('<a href="/test_admin/%s/logout/">' % self.urlbit not in response.content)