2011-07-02 12 views
21

Estoy vagamente familiarizado con la naturaleza del Unicode, pero no estoy seguro de cómo encajan todas las piezas. Tengo un error al mostrar instancias específicas en la página de administración.django error unicode en la página de administración

Caught UnicodeEncodeError while rendering: 'ascii' codec can't encode character u'\u2019' in position 29: ordinal not in range(128)

Aquí es mi modelo:

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) 

he ido en mi base de datos MySQL y verificó que la base de datos, tablas y columnas están cotejados como utf8_unicode_ci, así que no entiendo por qué el la página está tratando de renderizar como ascii. Mirando varios foros y documentos, veo mencionar las funciones str y unicode, pero no parecen tener nada que ver con esto ya que la lista de instancias aparece bien en la página de administración. Solo muestra el formulario de instancia real que causa un problema.

He aquí algunos ejemplos xml me sacó 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> 

Incluso he intentado excluir deliberadamente el XML (que no puedo hacer en el largo plazo, ya que me gustaría que se ser editable en la sección de administración), pero sigo teniendo el mismo error, así que ni siquiera estoy convencido de que el xml sea el problema. Si el xml no es el problema, no tengo idea de qué otra cosa podría evitar que se muestre esta página.

class ProposalAdmin(admin.ModelAdmin): 
    exclude = ('xml',) 
admin.site.register(Project) 

Respuesta

38

Hay un personaje en alguna parte, probablemente en self.project.name. Probablemente pueda encontrarlo si revisa el mensaje de error completo.

Sin embargo, si usted está consiguiendo resultados Unicode de su base de datos que probablemente sería más inteligente para hacer algo como esto:

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

Lo más inteligente de hacer, ya que es recommended by the Django documentation, es poner en práctica la __unicode__ función de su lugar:

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

Gracias por el truco encoded() - ps: debe ser 'encode ('ascii', 'replace')' –

+0

@Yuji Tomita, creo que se puede llamar de ambas formas. Argumentos de palabras clave y cosas así: http://docs.python.org/reference/expressions.html#calls –

+2

'encode()' no toma argumentos de palabra clave - al menos en 2.6 –

6

2019 es RIGHT SINGLE QUOTATION MARK, usado comúnmente como un apóstrofo tipográfico.

El problema probablemente es causado por usted usando __str__ en lugar de __unicode__ y Django's documentation recomienda que sólo utilice __unicode__.

La lista de instancias probablemente se muestre bien porque no incluye el campo que contiene el apóstrofo.

+0

upvote mil millones de veces para la recomendación '__unicode__'! Pasé como 3 horas buscando razones por las que recibía errores en la vista de detalles del administrador. la anulación de __unicode__ lo solucionó por mí. –

5

(me gustaría añadir esto como un comentario a Andre, pero no tienen los 50 puntos aún)

Este:

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

Debe ser

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

Esto es especialmente true si usa una variable en la definición que hace referencia a otro modelo que puede devolver una cadena con caracteres que no le gustan a unicode.Poner la "u" al frente del texto devuelto se asegura de que todo sea kosher y se devuelva como unicode.

Cuestiones relacionadas