2010-05-11 5 views
8

Je travaille à travers le Django tutorials, et maintenant je suis à la création d'un sondage.Modèle Django Poll

Le code ci-dessous fonctionne bien jusqu'à ce que je veux créer des choix, où pour une raison quelconque, je reçois toujours ce message d'erreur:

line 22, in __unicode__ 
return self.question 

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

Qu'est-ce que je fais mal?

Voici mon code:

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 

Répondre

10

La méthode __unicode__ sur le modèle Choice devrait ressembler à:

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

question attribut n'existe pas sur le modèle Choice, vous avez besoin de l'atteindre sur le champ de clé étrangère poll. N'oubliez pas de consulter la bonne documentation de Django qui montre de nombreux exemples on how to handle many to one relationships.

Modifier

Il serait sans doute plus judicieux de return self.choice dans Choice modèle __unicode__ méthode de sorte qu'il génère le choix réel et non la question du sondage.

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

Je l'ai fait et maintenant je reçois ces réponses: >>> Poll.objects.all() [] >>> Poll.objects.get (pk = 1) >>> p = Poll.objects.get (pk = 1) >>> p.choice_set.all() [, ] >>> p.choice_set.create (choice = 'Pas beaucoup', votes = 0) >>> il ne devrait pas avoir de choix au début, parce que je n'ai pas fait de choix. Merci pour le lien de la documentation! Je vais vérifier. – MacPython

+0

Vraiment, je suppose qu'il serait stupide d'avoir quelque chose comme 'return self.poll.question' pour la sortie, essayez' return self.choice' –

+0

Merci pour les réponses! Je ne peux pas dire avec certitude si le retour.self.choice est la solution parce que pour une autre raison, la page principale n'apparaîtra pas maintenant. Donc je dois résoudre cela et fermer cette question pour le moment. Merci encore! C'est le meilleur site que j'ai rencontré jusqu'à présent. Très utile! – MacPython

4

Il devrait être:

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

Comme sondage est un modèle connexe qui contient la question.

7

Pour donner suite à la réponse de rébus, le tutoriel dit en fait d'ajouter différents retourne à chaque modèle:

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

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

Vous avez eu « self.question » comme le retour à la fois - je pense vous avez fait la même erreur de copier/coller que j'ai faite, ou le tutoriel avait déjà cette erreur ;-)

+1

C'est en fait la "bonne" réponse basée sur le tutoriel. Vous ne savez pas pourquoi vous souhaitez renvoyer le texte de la question du sondage lors de l'impression d'une instance de choix. – threejeez

1

Ceci est dû à une erreur de cerveau humain ou à une erreur de copier/coller. Nous/Vous pensiez que les deux fonctions étaient identiques et copier-coller le même code pour les deux, mais il y avait un mot différent dans les deux.

remplacer question à choice en ligne 22