2010-05-11 12 views
8

Estoy trabajando en el Django tutorials, y ahora estoy creando una encuesta.Modelo Django Encuesta

El código siguiente funciona bien hasta que quiero crear opciones, donde por alguna razón, siempre sale este mensaje de error:

line 22, in __unicode__ 
return self.question 

AttributeError: 'Choice' object has no attribute 'question' 

¿Qué estoy haciendo mal?

Aquí está mi código:

import datetime 
from django.db import models 

class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

    def __unicode__(self): 
     return self.question 

    def was_published_today(self): 
     return self.pub_date.date() == datetime.date.today() 



class Choice(models.Model): 
    poll = models.ForeignKey(Poll) 
    choice = models.CharField(max_length=200) 
    votes = models.IntegerField() 

    def __unicode__(self): 
     return self.question # this is line 22 

Respuesta

10

El método __unicode__ en el modelo Choice debería ser algo como:

def __unicode__(self): 
    return self.poll.question 

question atributo no existe en el modelo Choice, es necesario llegar a ella sobre el campo de clave externa poll.

No se olvide de verificar la gran documentación de Django que muestra muchos ejemplos on how to handle many to one relationships.

Editar

Sería probablemente más sentido return self.choice en Choice modelo __unicode__ método por lo que no se da salida a la elección real de la pregunta de la encuesta.

def __unicode__(self): 
    return self.choice 
+0

lo hice y ahora tengo estas respuestas: >>> Poll.objects.all() [] >>> Poll.objects.get (pk = 1) >>> p = Poll.objects.get (pk = 1) >>> p.choice_set.all() [, ] >>> p.choice_set.create (choice = 'No mucho', votos = 0) >>> no debería tener opciones al principio, porque no establecí ninguna opción. ¡Gracias por el enlace a la documentación! Lo comprobaré. – MacPython

+0

Cierto, supongo que sería una tontería tener algo como 'return self.poll.question' para la salida, intente' return self.choice' –

+0

¡Gracias por las respuestas! No puedo decir con certeza si la opción return.self.choice es la solución porque, por alguna otra razón, main_page no se mostrará ahora. Así que tengo que resolver eso y cerrar esta pregunta por ahora. ¡Gracias de nuevo! Este es el mejor sitio que he encontrado hasta ahora. ¡De mucha ayuda! – MacPython

4

que debe ser:

def __unicode__(self): 
    return self.poll.question 

Debido encuesta es un modelo relacionado que contiene la pregunta.

7

Para dar seguimiento a la respuesta de jeroglífico, el tutorial dice en realidad añadir diferentes retornos a cada modelo:

class Poll(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.question 

class Choice(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.choice 

Tenías 'self.question' como el cambio de ambos - Estoy pensando cometió el mismo error de copiar/pegar que yo, o el tutorial que tuvo ese error anteriormente ;-)

+1

Esta es realmente la respuesta "correcta" basada en el tutorial. No estoy seguro de por qué desea devolver el texto de la pregunta de la encuesta al imprimir una instancia de elección. – threejeez

1

Esto se debe a un error de Cerebro humano o a un error de copiar/pegar. Nosotros/Usted pensó que ambas funciones eran las mismas y copió y pegó el mismo código para ambos, pero había una palabra diferente en ambas.

reemplazar a questionchoice en la línea 22