2010-05-11 12 views
8

Sto lavorando attraverso lo Django tutorials e ora sto creando un sondaggio.Modello Django Poll

Il codice sotto funziona bene fino a quando voglio creare scelte, in cui per qualche motivo ho sempre ottenere questo messaggio di errore:

line 22, in __unicode__ 
return self.question 

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

Che cosa sto facendo di sbagliato?

Ecco il mio codice:

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 

risposta

10

Il metodo __unicode__ sul modello Choice dovrebbe essere simile:

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

question non esiste sul modello Choice, è necessario raggiungere per esso sul campo chiave esterna poll.

Non dimenticare di dare un'occhiata alla grande documentazione di Django che mostra molti esempi on how to handle many to one relationships.

Modifica

Sarebbe probabilmente più senso return self.choice in Choice modello __unicode__ metodo in modo che emette il non scelta effettiva la questione sondaggio.

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

ho fatto e ora ho queste risposte: >>> Poll.objects.all() [] >>> Poll.objects.get (pk = 1) >>> p = Poll.objects.get (pk = 1) >>> p.choice_set.all() [, ] >>> p.choice_set.create (scelta = 'Non molto', voti = 0) >>> non dovrebbe avere scelte all'inizio, perché non ho impostato alcuna scelta. Grazie per il link alla documentazione! Lo controllerò. – MacPython

+0

Vero, penso che sarebbe sciocco avere qualcosa come 'return self.poll.question' per l'output, prova' return self.choice' –

+0

Grazie per le risposte! Non posso dire con certezza se il return.self.choice è la soluzione perché per qualche altro motivo la pagina principale non verrà visualizzata ora. Quindi devo risolverlo e chiudere questa domanda per ora. Grazie ancora! Questo è il miglior sito che ho incontrato finora. Davvero utile! – MacPython

4

dovrebbe essere:

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

Perché sondaggio è un modello correlato che contiene la domanda.

7

dare seguito alla risposta di rebus, il tutorial in realtà dice di aggiungere rendimenti diversi per ogni modello:

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

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

Dovevi 'self.question' come il ritorno per entrambi - sto pensando hai fatto lo stesso errore di copia/incolla che ho fatto, o il tutorial aveva precedentemente quell'errore ;-)

+1

Questa è in realtà la risposta "giusta" basata sul tutorial. Non sei sicuro del motivo per cui desideri restituire il testo della domanda del sondaggio quando stampi un'istanza scelta. – threejeez

1

Ciò è dovuto a un errore di Human Brain o a un errore di copia/incolla. Pensavamo che entrambe le funzioni fossero uguali e copiavano lo stesso codice per entrambi, ma in entrambi c'era una parola diversa.

sostituire question a choice in linea 22