2010-02-07 5 views
1

Dans une application django, j'ai des modèles pour un mot (à apprendre), un étudiant (apprentissage), et StudentWord est une table pour gérer le plusieurs à plusieurs:django nouveau champ générant "nom global ... n'est pas défini" erreur

class Word(models.Model): 
    word = models.CharField(max_length=80) 
    image = models.ForeignKey(Image) 
    language = models.ForeignKey(Language) 
    def __unicode__(self): 
     return self.word 

class Student(models.Model): 
    username = models.ForeignKey(User) 
    words = models.ManyToManyField(Word, through='StudentWord') 
    def __unicode__(self): 
     return self.username.username 

class StudentWord(models.Model): 
    word = models.ForeignKey(Word) 
    student = models.ForeignKey(Student) 
    level = models.IntegerField() 
    nextdate = models.DateField() <-- this field newly added 
    learned = models.BooleanField() 
    def __unicode__(self): 
     return u'%s %s' % (self.student, self.word) 

je l'avais travailler, mais je voulais ajouter une fonction où l'application serait de savoir quand était la prochaine date de demander à l'élève ce mot. Pour cela, j'ai ajouté le champ nextdate au modèle StudentWord, supprimé la table studentword dans MySQL, utilisé syncdb pour le régénérer, et utilisé la page d'administration pour ajouter quelques mots studentwords (avec le nouveau champ pour la date).

Cependant, la partie suivante de l'affichage génère une erreur:

def index(request): 
    last_question = request.session.get('last_question', 'none') 
    student_language = request.session.get('student_language', 'english') 
    student=Student.objects.get(username=request.user) 
    words_student_knows = Word.objects.filter(studentword__student=student, studentword__learned=True) 
    words_student_knows.filter(studentword__nextdate<=datetime.date.today()) 

L'erreur est:

Exception Type: NameError 
Exception Value: 
global name 'studentword__nextdate' is not defined 
Exception Location: /home/wordcode/words/vocabulary/views.py in index, line 32 

ligne 32 est la dernière ligne de l'extrait du point de vue ci-dessus. Lorsque je supprime ce filtre, l'erreur disparaît, il semble donc être lié au nouveau champ. J'ai utilisé: Importer datetime ... dans la vue, et je suis capable d'utiliser datetime.date.today() ailleurs dans le code sans problème. Je pense que cela n'a pas été détecté sur le nouveau champ ajouté, mais comme le site admin comprend qu'il est présent, cela ne semble pas probable, et en tout cas, il supprime la table studentword et la recréer devrait faire l'affaire.

Toute aide ou conseil est apprécié.

Répondre

9

Vous avez mal compris comment vous réussissez les comparaisons dans les filtres de modèle Django. Au lieu de votre dernière ligne, vous devez faire ceci:

words_student_knows.filter(studentword__nextdate__lte=datetime.date.today()) 

épeautre cette façon, le filtre est correctement transmis au gestionnaire de modèle comme argument de mot-clé , qui est ensuite décomposé en ses parties constitutives et traitées avec succès au sein du gestionnaire. La façon dont vous l'avez eu, cependant, signifiait que Python essayait d'évaluer le résultat de studentword__nextdate<=datetime.date.today() directement dans la fonction d'appel, dans le but de transmettre une valeur booléenne à la fonction de destination. Bien sûr, il n'y a pas de variable locale appelée studentword__nextdate, d'où l'erreur.

+0

Exactement, merci! – rossdavidh

Questions connexes