erreur django unicode sur la page d'administration

Je suis vaguement familier avec la nature d'unicode, mais je ne suis pas sûr de savoir comment toutes les pièces s'emboîtent. J'ai une erreur lors de l'affichage de cas spécifiques dans la page d'administration.

Pris UnicodeEncodeError tandis que rendu: le codec 'ascii' ne peut pas encoder caractère u' u2019 ' en position 29: ordinal n'est pas dans la plage (128)

Voici mon modèle:

class Proposal(models.Model):
    project = models.ForeignKey(Project)
    dateCreated = models.DateTimeField(editable=False)
    xml = models.TextField(max_length=1000000)

    def __str__(self):
        return str('Proposal for: %s' % self.project.name)

Je suis allé dans ma base de données mysql et j'ai vérifié que la base de données, la table et la colonne sont toutes rassemblées comme utf8_unicode_ci, donc je ne comprends pas pourquoi la page essaie de rendre en ascii. En regardant divers forums et documents, je vois une mention des fonctions str et unicode, mais elles ne semblent pas avoir à voir avec cela car la liste des instances s'affiche bien sur la page d'administration. Il montre simplement la forme d'instance réelle qui cause un problème.

Voici un exemple xml que j'ai tiré de phpmyadmin...

<?xml version="1.0"  encoding="UTF-8"?>
<proposal>

  <section title="OVERVIEW">
    <section title="Introduction">
      <text>
    This proposal is not in the system because it was completed as an agreement in Word previous to us getting this application up and running.  Please refer to the attachments in this project for documentation or to see the agreement.
      </text>
    </section>
  </section>
</proposal>

J'ai même essayé d'exclure délibérément le xml (ce que je ne peux pas faire à long terme car je voudrais qu'il soit modifiable dans la section admin), mais je reçois toujours la même erreur, donc je ne suis même pas convaincu que le xml est même le problème. Si le xml n'est pas le problème, je n'ai aucune idée de ce qui pourrait empêcher cette page d'être affichée.

class ProposalAdmin(admin.ModelAdmin):
    exclude = ('xml',)
admin.site.register(Project)
24
demandé sur voodoogiant 2011-07-03 03:51:56

3 réponses

Il y a un caractère quelque part, probablement dans self.project.name. Vous pourriez probablement le trouver si vous vérifiez tout le message d'erreur.

Cependant, si vous obtenez des résultats unicode à partir de votre base de données, il serait probablement plus intelligent de faire quelque chose comme ceci:

def __str__(self):
    return ('Proposal for: %s' % self.project.name).encode('ascii', errors='replace')

La chose la plus intelligente à faire, puisque c'est recommandé par la documentation Django , est d'implémenter la fonction __unicode__ à la place:

def __unicode__(self):
    return u'Proposal for: %s' % self.project.name
42
répondu André Laszlo 2015-07-15 07:42:43

2019 est juste un guillemet simple , couramment utilisé comme apostrophe bouclée.

Le problème probablement est causé par l'utilisation de __str__ au lieu de __unicode__, et la documentation de de Django vous recommande d'utiliser uniquement __unicode__.

La liste des instances s'affiche probablement correctement car elle n'inclut pas le champ contenant l'apostrophe.

8
répondu Jim 2011-07-03 00:11:23

(j'ajouterais ceci comme commentaire à Andre mais n'ai pas encore les 50 points)

Ceci:

def __unicode__(self):
    return 'Proposal for: %s' % self.project.name

Devrait être

def __unicode__(self):
    return u'Proposal for: %s' % self.project.name

Cela est particulièrement vrai si vous utilisez une variable dans la définition qui fait référence à un autre modèle qui peut renvoyer une chaîne avec des caractères que unicode n'aime pas. Mettre dans le "u" devant le texte retourné assure que tout est casher et retourné en unicode.

5
répondu Pstrazzulla 2014-06-13 19:04:49