2010-01-25 14 views
6

Ho il seguente codice nella mia applicazione django.django: gettext e coercing per unicode

class Status(object): 

    def __init__(self, id, desc): 
     self.id = id 
     self.desc = desc 

    def __unicode__(self): 
     return self.desc 

STATUS = Status(0, _(u"Some text")) 

Quando cerco di visualizzare alcune stato (o anche costringere a unicode), ottengo:

TypeError: coercing to Unicode: need string or buffer, __proxy__ found 

Qualcuno mi potrebbe spiegare, che cosa sto facendo male?

risposta

21

La funzione _() di Django può restituire un oggetto django.utils.functional.__proxy__, che non è esso stesso unicode (vedere http://docs.djangoproject.com/en/1.1/ref/unicode/#translated-strings). Python non chiama in modo ricorsivo unicode(), quindi è un errore per l'oggetto Status restituire direttamente l'oggetto __proxy__. È necessario creare il metodo __unicode__return unicode(self.desc).

Si noti che questo è specifico per Django; Lo gettext di Python non restituisce questi oggetti proxy.

+0

Grazie mille, questo è esattamente ciò di cui avevo bisogno. – gruszczy

0

suppongo che @ Thomas-wounters risolto il problema, ma per gli altri che potrebbero avere un problema simile - si prega di verificare se non si utilizza ugettext_lazy:

from django.utils.translation import ugettext_lazy as _ 

in questo caso, è necessario eseguire il cast di uscita str/unicode:

unicode(_('translate me'))