'Django: KeyError in admin on listing boolean fields

Whenever I decided to list a Boolean Field in my list_display such as 'active' (see example)

class CompanyAdmin(admin.ModelAdmin):
    fields = ['name', 'created']
    list_display = ['name', 'active', 'created']

I get the following error...

KeyError at /admin/web/company/

'\x01'

This happens on any Boolean values I try to list. I'm using grappelli as the admin skin. I have included the full error below and my model.

Model:

class Company(models.Model):
    companyid = models.CharField(max_length=255, primary_key=True, db_column='companyID')
    name = models.CharField(max_length=105)
    active = models.BooleanField(default=False)
    created = models.DateTimeField()
    modified = models.DateTimeField(null=True, blank=True)
    class Meta:
        db_table = u'company'

Error: Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/admin/web/company/

Django Version: 1.4.2
Python Version: 2.7.2
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.flatpages',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'grappelli.dashboard',
 'grappelli',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'web')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Template error:
In template /Users/user/Documents/workspace/Ares/grappelli/templates/admin/change_list.html, error at line 222

   212 :                     {% blocktrans count cl.formset.errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}


   213 :                 </p>


   214 :                 {{ cl.formset.non_form_errors }}


   215 :             {% endif %}


   216 :             <!-- MANAGEMENT FORM -->


   217 :             {% if cl.formset %}


   218 :                 {{ cl.formset.management_form }}


   219 :             {% endif %}


   220 :             <!-- CHANGELIST-RESULTS -->


   221 :             {% block result_list %}


   222 :                  {% result_list cl %} 


   223 :             {% endblock %}


   224 :         </section>


   225 :         <!-- PAGINATION BOTTOM -->


   226 :         {% if not cl.result_count == 0 %}


   227 :             {% block pagination_bottom %}


   228 :                 <div class="grp-module">


   229 :                     <div class="grp-row">{% pagination cl %}</div>


   230 :                 </div>


   231 :             {% endblock %}


   232 :         {% endif %}


Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  136.                     response = response.render()
File "/Library/Python/2.7/site-packages/django/template/response.py" in render
  104.             self._set_content(self.rendered_content)
File "/Library/Python/2.7/site-packages/django/template/response.py" in rendered_content
  81.         content = template.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/Library/Python/2.7/site-packages/django/template/base.py" in render
  1178.                     _dict = func(*resolved_args, **resolved_kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in result_list
  278.             'results': list(results(cl))}
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in results
  256.             yield ResultList(None, items_for_result(cl, res, None))
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in __init__
  248.         super(ResultList, self).__init__(*items)
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in items_for_result
  204.                     result_repr = display_for_field(value, f)
File "/Library/Python/2.7/site-packages/django/contrib/admin/util.py" in display_for_field
  321.         return _boolean_icon(value)
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in _boolean_icon
  164.                       {True: 'yes', False: 'no', None: 'unknown'}[field_val])

Exception Type: KeyError at /admin/web/company/
Exception Value: '\x01'


Solution 1:[1]

Just posting an update (on the correct answer by bakkal) for django ? 3.0, as Subfieldbase() has been deprecated and replaced by from_db_value(). Read the docs.

    class MyBooleanField(models.BooleanField):

        def get_internal_type(self):
            return "MyBooleanField"

        def db_type(self):
            return 'bit(1)'

        def from_db_value(self, value, expression, connection):
            if value in ('t', 'True', '1', b'\x01'): return True
            elif value in ('f', 'False', '0', b'\x00'): return False
            else: return None

        def to_python(self, value):
            if value in (True, False): return value
            if value in ('t', 'True', '1', b'\x01'): return True
            if value in ('f', 'False', '0', b'\x00'): return False

        def get_db_prep_value(self, value):
            return 0x01 if value else 0x00

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1