2015-11-18 5 views
0

Я потратил часы, пытаясь понять, что это безрезультатно .. Любая идея, почему эта проблема происходит?Сравнение Django datetime None - Почему?

models.py

from datetime import date, datetime 

class Product(models.Model): 
    use_activation_date = models.BooleanField(default=False) 
    activation_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True 

    @property 
    def is_active_by_date(self): 
     if self.use_activation_date: 
      if datetime.now() < self.activation_date: 
       return False #is not active because current date is before activate date 
      else: 
       return True #is active because date is = or past activation_date 
     else: 
      return True #is active because not using activation date 

template.html

   {% if not product.is_active_by_date %} 
       <!-- here is the problem, it is not returning True nor False! --> 
        {{ product.is_active_by_date }} <!-- getting blank result here --> 
        Product is not active 
       {% else %} 
        {{ product.is_active_by_date }} 
        Product is active 
       {% endif %} 

Проблема происходит это, когда product.use_activation_date = True, {{ product.is_active_by_date }} возвращает True; однако, как только свойство попадает в строку сравнения даты и времени: if datetime.now() < self.activation_date происходит что-то неправильно, и возвращается None. Я попробовал распечатать datetime.now() и self.activation_date, и они оба отображаются в равном формате, например. «18 ноября 2015 года, 10:00» и все выглядит нормально ..

Что происходит? Любая помощь чрезвычайно ценится!

+0

в ложном случае, что вы видите, если вы просто выведете '{{product}}'? – Anentropic

ответ

1

Возможно, механизм шаблона проглотил ошибку в свойстве. Попробуйте получить доступ к product.is_active_by_date, чтобы посмотреть, что он возвращает.

Если у вас есть timezone support enabled, вы должны использовать timezone.now() вместо datetime.now().

from django.utils import timezone 

class Product(models.Model): 
    @property 
    def is_active_by_date(self): 
     if self.use_activation_date: 
     if timezone.now() < self.activation_date: 
+0

oh хорошая мысль! просто попробовал это, и это дало мне ошибку: не могу сравнить даты смещения с наименьшими и смещенными значениями Спасибо! Это должно быть хорошим указателем для меня – user2966495

+0

Что вы попробовали? Доступ к 'product.is_active_by_date' в представлении или изменение метода для использования' timezone.now() '? У вас включена поддержка временной зоны (проверьте, есть ли в ваших настройках 'USE_TZ = True')? – Alasdair

+0

оба, когда я попытался получить доступ к 'product.is_active_by_date', он дал мне эту ошибку, затем переключил' datetime.now() 'на' timezone.now() 'и решил мою проблему! Он отлично работает, спасибо! – user2966495

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