From 43193c18213de725f0f957ab21518baad7d9bdd6 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Fri, 12 Jan 2007 19:40:06 +0000 Subject: [PATCH] Fixed #3287: method columns in the admin changelist can now have a {{{boolean}}} attribute that uses the clever little checkmark icons instead of the ugly "True" or "False" strings. Thanks for the patch, xian@mintchaos.com git-svn-id: http://code.djangoproject.com/svn/django/trunk@4309 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- .../contrib/admin/templatetags/admin_list.py | 14 +++++++++++--- docs/model-api.txt | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index 832b3562cd..3c0c6f0ac2 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -101,6 +101,10 @@ def result_headers(cl): "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}), "class_attrib": (th_classes and ' class="%s"' % ' '.join(th_classes) or '')} +def _boolean_icon(field_val): + BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'} + return '%s' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val) + def items_for_result(cl, result): first = True pk = cl.lookup_opts.pk.attname @@ -114,9 +118,14 @@ def items_for_result(cl, result): try: attr = getattr(result, field_name) allow_tags = getattr(attr, 'allow_tags', False) + boolean = getattr(attr, 'boolean', False) if callable(attr): attr = attr() - result_repr = str(attr) + if boolean: + allow_tags = True + result_repr = _boolean_icon(attr) + else: + result_repr = str(attr) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: @@ -147,8 +156,7 @@ def items_for_result(cl, result): row_class = ' class="nowrap"' # Booleans are special: We use images. elif isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField): - BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'} - result_repr = '%s' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val) + result_repr = _boolean_icon(field_val) # FloatFields are special: Zero-pad the decimals. elif isinstance(f, models.FloatField): if field_val is not None: diff --git a/docs/model-api.txt b/docs/model-api.txt index 725ec52141..603c131662 100644 --- a/docs/model-api.txt +++ b/docs/model-api.txt @@ -1268,6 +1268,24 @@ A few special cases to note about ``list_display``: return '%s %s' % (self.color_code, self.first_name, self.last_name) colored_name.allow_tags = True + * If the string given is a method of the model that returns True or False + Django will display a pretty "on" or "off" icon if you give the method a + ``boolean`` attribute whose value is ``True``. + + Here's a full example model:: + + class Person(models.Model): + first_name = models.CharField(maxlength=50) + birthday = models.DateField() + + class Admin: + list_display = ('name', 'born_in_fifties') + + def born_in_fifties(self): + return self.birthday.strftime('%Y')[:3] == 5 + born_in_fifties.boolean = True + + * The ``__str__()`` method is just as valid in ``list_display`` as any other model method, so it's perfectly OK to do this::