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 execute()
were:
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 models.py
:
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 program in Python, I live in the Netherlands, I cycle recumbent bikes and I have a model railway.
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):