2010-02-07 4 views
1

В приложении django у меня есть модели для Word (для изучения), Student (обучение), а StudentWord - это таблица для обработки многие ко многим:django новое поле, генерирующее «глобальное имя ... не определено» ошибка

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) 

Я имел это работает, но хотел бы добавить функцию, где приложение будет знать, когда была следующая дата попросить студента это слово. Для этого я добавил поле nextdate к модели StudentWord, удалил таблицу студента в MySQL, использовал syncdb для его регенерации и использовал страницу администрирования, чтобы успешно добавить несколько студенческих слов (с новым полем для даты в нем).

Однако следующая часть вида генерирует сообщение об ошибке:

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()) 

Ошибка:

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

линия 32 является последней линией фрагмента из приведенного выше точек зрения. Когда я удаляю этот фильтр, ошибка исчезает, поэтому, похоже, это связано с новым полем. Я использовал: import datetime ... в представлении, и я могу использовать datetime.date.today() в другом месте кода без проблем.

Мое предположение заключалось в том, что каким-то образом оно не появилось в новом добавленном поле, но поскольку сайт-администратор понимает, что он есть, это, похоже, не является вероятным и в любом случае удаляет таблицу студенческого слова и воссоздает ее должен сделать трюк.

Любая помощь или совет приветствуются.

ответ

9

Вы неправильно поняли, как вы проходите сравнения в фильтрах модели Django. Вместо последней строки, вам нужно сделать, это:

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

Записанный таким образом, фильтр правильно передается менеджеру модели в качестве именованного аргумента в, который затем разбивается на составные части и переработанной успешно в составе менеджера.

То, как вы это делали, означало, что Python пытался оценить результат studentword__nextdate<=datetime.date.today() прямо в вызывающей функции, стремясь передать логическое значение целевой функции. Конечно, нет локальной переменной, называемой studentword__nextdate, поэтому ошибка.

+0

Справа вы, спасибо! – rossdavidh

 Смежные вопросы

  • Нет связанных вопросов^_^