Breves: coercing to Unicode y gettext en Django

written by uve 18 September 2010

Siguiendo con el desarrollo del módulo de noticias, he encontrado el mismo error, pero esta vez debido al uso de gettext:

>>> model_instance.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/django/db/models/query.py", line 71, in __repr__
    return repr(data)
  File "/usr/lib/pymodules/python2.6/django/db/models/base.py", line 345, in __repr__
    u = unicode(self)
TypeError: coercing to Unicode: need string or buffer, __proxy__ found

Normalmente utilizo ugettext_lazy (proporcionado por Django en utils.translation) por cuestiones de eficiencia. El problema proviene del mismo sitio: def __unicode__(self)

Es muy importante que nos aseguramos que siempre se devuelva una instancia de unicode, si no, este método causará un error. Por tanto, en lugar de lo siguiente:

from django.utils.translation import ugettext_lazy as _
...
class Entry(models.Model):
...
    def __unicode__(self):
        return _(u'Entry %s' % self.pk)

debemos hacer esto:

from django.utils.translation import ugettext as _
...
class Entry(models.Model):
...
    def __unicode__(self):
        return _(u'Entry %s' % self.pk)

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.