I was adding translations to my Django application and got a weird-looking error when running my tests:
Traceback (most recent call last): ... File ".../django/db/backends/sqlite3/base.py", line 238, in execute return Database.Cursor.execute(self, query, params) pysqlite2.dbapi2.InterfaceError: Error binding parameter 0 - probably unsupported type.
Googling showed some mailinglist activity from 2006 and a five year old long-closed Django bug. So I must be doing something really wrong here :-)
Luckily we’re all using open source, so (after a tip from a colleague) I put
some print statements into
django/db/backends/sqlite3/base.py. A couple of
the the queries and params passed into
Q: INSERT INTO "auth_permission" ("name", "content_type_id", "codename") VALUES (?, ?, ?) P: (u'Can change User group', 11, u'change_usergroup') Q: INSERT INTO "auth_permission" ("name", "content_type_id", "codename") VALUES (?, ?, ?) P: (u'Can delete User group', 11, u'delete_usergroup') Q: INSERT INTO "auth_permission" ("name", "content_type_id", "codename") VALUES (?, ?, ?) P: (<django.utils.functional.__proxy__ object at 0x1ce3ab0>, 11, 'can_view_lizard_data')
Hey! That last one looks different! Ah, that’s my newly-added translation. I
had something like this inside my
from django.db import models from django.utils.translation import ugettext_lazy as _ class UserGroup(models.Model): ... class Meta: permissions = ( ('can_view_lizard_data', _('Can view lizard data')), # ^^^ note the _() translation marker. )
I was translating the permission’s friendly name. Turns out, those permission names cannot be translated as they’re database content instead of strings inside Python code. See the explanation in Django ticket 13861.
Learned another thing today :-)
My name is Reinout van Rees and I work a lot with Python (programming language) and Django (website framework). I live in The Netherlands and I'm happily married to Annie van Rees-Kooiman.
Most of my website content is in my weblog. You can keep up to date by subscribing to the automatic feeds (for instance with Google reader):