Django Evitar error en el administrador "decoding Unicode is not supported"


Si, como es probable, os habéis encontrado con este error en el administrador cuando examináis modelos con caracteres utf-8, creo que puede deberse al hecho de que django sirve los strings en unicode pero sin codificar.

En python, en el momento que intentamos algo como esto:

>>> unicode('pepe', 'utf-8')
u'pepe'
>>> unicode(u'pepe', 'utf-8')

Traceback (most recent call last):
File "", line 1, in
TypeError: decoding Unicode is not supported

Obtenemos el TypeError. En el admin de django, el error lo obtendremos siempre que grabemos caracteres >255. Parece provenir del hecho de codificar el unicode en ascii en vez de utf-8 ¿?.

Si hacemos:

def __unicode__(self):
return unicode(self.descripcion)


Obtendremos el error de decodificación ascii, pero si hacemos...


def __unicode__(self):
return unicode(self.descripcion, 'utf-8')


...nos funcionará pero no podremos usar el admin para examinar el modelo porque nos genera el error anterior.

Tenemos dos posibilidades, aunque no las comprendo en profundidad:

Solución 1):

from django.utils.encoding import smart_unicode

En los modelos poner:

def __unicode__(self):
return smart_unicode(("%s" % self.descripcion))


Solución 2) Llamado "método del literal"

def __unicode__(self):
return (u"%s" % self.descripcion)


En todo caso es conveniente poner el setting

DEFAULT_CHARSET='utf-8'

que fuerza utf-8 a la hora de procesar y servir las plantillas.

Más info sobre este tema estaría bien. En mi caso uso mysql con utf-8 y ordenación spanish2, ubuntu 10.10 con utf-8 y apache forzado a servir utf-8.