2013-06-11 4 views
0

J'essaie de comprendre comment gérer correctement les caractères spéciaux dans Django/Python. J'ai ajouté à mon views.py et models.py la chaîne de codage suivant:Gestion des caractères spéciaux django

# -*- coding: utf-8 -*- 

Mais quand la cmd suivante est appelée avec un nom de l'ordre d'achat réglé sur « TestÄÜÖ » il plante:

messages.add_message(request, messages.INFO, 'The purchase order "%s" has been successfully added to project "%s".' % (purchase_order, project.name)) 

l'erreur renvoyée est la suivante:

File "..accounting/views.py", line 1100, in post_logic 
    messages.add_message(request, messages.INFO, 'The purchase order "%s" has been successfully added to project "%s".' % (purchase_order, project.name)) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 20: ordinal not in range(128) 

le modèle PurchaseOrder ressemble à ceci.

class PurchaseOrder(models.Model): 
    """ 
    purchase order assigned to a project 
    """ 

    number = models.CharField(max_length=200) 
    name = models.CharField(max_length=200, null=True, blank=True, default="") 

    def __unicode__(self): 
     return u'%s - %s' % (self.name, self.number) 

Le problème ne se produit pas si j'ajoute u en face de la chaîne de message:

messages.add_message(request, messages.INFO, u'The purchase order "%s" has been successfully added to project "%s".' % (purchase_order, project.name)) 

Mais le docs dire que dans Django 1.5 (j'utilise 1,5) une chaîne normale devrait être une chaîne unicode et il n'y a pas besoin de u.

Donc je ne veux pas ajouter à tous mes appels add_message un u, si les docs disent que ce n'est pas nécessaire. Quelqu'un peut-il faire la lumière sur ce sujet d'encodage?

+0

Essayez-le avec 'purchase_order.encode ('utf-8')' –

Répondre

2

Vous avez manqué le from __future__ import unicode_literals qui ferait en sorte que les chaînes dans Python2 agissent comme des chaînes Unicode Python3.

+0

Merci! Manqué que dans les docs :( –