Skip to content

Commit

Permalink
Ensure that NullBooleanField displays the appropriate icon for null v…
Browse files Browse the repository at this point in the history
…alues in admin changelists. Refs #13071.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12746 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
ubernostrum committed Mar 10, 2010
1 parent 7488e83 commit 1e68c81
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 3 deletions.
6 changes: 4 additions & 2 deletions django/contrib/admin/util.py
Expand Up @@ -337,12 +337,14 @@ def display_for_field(value, field):

if field.flatchoices:
return dict(field.flatchoices).get(value, EMPTY_CHANGELIST_VALUE)
# NullBooleanField needs special-case null-handling, so it comes
# before the general null test.
elif isinstance(field, models.BooleanField) or isinstance(field, models.NullBooleanField):
return _boolean_icon(value)
elif value is None:
return EMPTY_CHANGELIST_VALUE
elif isinstance(field, models.DateField) or isinstance(field, models.TimeField):
return formats.localize(value)
elif isinstance(field, models.BooleanField) or isinstance(field, models.NullBooleanField):
return _boolean_icon(value)
elif isinstance(field, models.DecimalField):
return formats.number_format(value, field.decimal_places)
elif isinstance(field, models.FloatField):
Expand Down
6 changes: 5 additions & 1 deletion tests/regressiontests/admin_util/tests.py
@@ -1,6 +1,7 @@
from datetime import datetime
import unittest

from django.conf import settings
from django.db import models
from django.utils.formats import localize
from django.test import TestCase
Expand Down Expand Up @@ -131,8 +132,11 @@ def test_null_display_for_field(self):
display_value = display_for_field(None, models.TimeField())
self.assertEqual(display_value, EMPTY_CHANGELIST_VALUE)

# Regression test for #13071: NullBooleanField has special
# handling.
display_value = display_for_field(None, models.NullBooleanField())
self.assertEqual(display_value, EMPTY_CHANGELIST_VALUE)
expected = u'<img src="%simg/admin/icon-unknown.gif" alt="None" />' % settings.ADMIN_MEDIA_PREFIX
self.assertEqual(display_value, expected)

display_value = display_for_field(None, models.DecimalField())
self.assertEqual(display_value, EMPTY_CHANGELIST_VALUE)
Expand Down
2 changes: 2 additions & 0 deletions tests/regressiontests/admin_views/models.py
Expand Up @@ -464,11 +464,13 @@ class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
posted = models.DateField(default=datetime.date.today)
public = models.NullBooleanField()

def awesomeness_level(self):
return "Very awesome."

class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'public']
readonly_fields = ('posted', 'awesomeness_level', 'coolness', lambda obj: "foo")

inlines = [
Expand Down
9 changes: 9 additions & 0 deletions tests/regressiontests/admin_views/tests.py
Expand Up @@ -253,6 +253,15 @@ def testNamedGroupFieldChoicesFilter(self):
"Changelist filter isn't showing options contained inside a model field 'choices' option named group."
)

def testChangeListNullBooleanDisplay(self):
Post.objects.create(public=None)
# This hard-codes the URl because it'll fail if it runs
# against the 'admin2' custom admin (which doesn't have the
# Post model).
response = self.client.get("/test_admin/admin/admin_views/post/")
self.failUnless('icon-unknown.gif' in response.content)
print "Passed"

class SaveAsTests(TestCase):
fixtures = ['admin-views-users.xml','admin-views-person.xml']

Expand Down

0 comments on commit 1e68c81

Please sign in to comment.