Django - 无法使时间函数(时区,日期时间)正常工作,获取ErrorName消息:未定义全局名称

时间:2013-02-06 01:06:10

标签: django datetime django-models timezone

我是Django新手,

我正在学习教程,我必须创建如下所示的两个模型:

import datetime
from django.db import models
from django.utils import timezone

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_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField()

    def __unicode__(self):
        return self.choice_text

以下代码来自教程。我应该成真。

# Make sure our custom method worked.
>>> p = Poll.objects.get(pk=1)
>>> p.was_published_recently()
True

但是当我输入(与教程相同的行)时:

>>> p = Poll.objects.get(pk=1)
>>> p.was_published_recently()

我收到以下错误消息:

models.py line 12 in was_published_recently
NameError: global name 'datetime' is not defined..

我导入了datetimetimezone ...我不明白为什么会收到错误消息。

任何帮助将不胜感激! : - )

8 个答案:

答案 0 :(得分:5)

  

您需要先从Django utils导入时区,然后才需要导入日期时间。

from django.db import models
    from django.utils import timezone
    import datetime

答案 1 :(得分:3)

在测试教程(第5部分)中,我们处理 polls / tests.py 文件。但是,当您运行测试时,错误会引发 polls / models.py 文件。测试教程中未提及此文件,但您可以在错误消息中看到它。

from django.utils import timezone添加到 polls / models.py 并再次尝试测试。

答案 2 :(得分:2)

无法重现问题,您的代码适合我。 你可以尝试这样的事情:

from datetime import timedelta as tdelta
...
def was_published_recently(self):
    return self.pub_date >= timezone.now() - tdelta(days=-1)

答案 3 :(得分:2)

如果您的问题与编写第一个Django应用(第5部分)有关,则应添加这两行

import datetime
from django.utils import timezone

答案 4 :(得分:0)

我知道这是一个较旧的主题。我有同样的问题,因为我忘了添加这一行: 来自django.utils导入时区

答案 5 :(得分:0)

为了澄清这一点,我需要在poll / models.py文件的顶部添加:

import datetime
from django.utils import timezone

答案 6 :(得分:0)

关于该错误消息,请注意Django文档所说的内容:

  

如果您遇到查询日期或时间的异常,请在提交错误之前尝试安装。 >这很简单:

$ sudo pip install pytz

安装软件包后,问题就会神奇地消失!

答案 7 :(得分:0)

我尝试了所有事情,但是问题仍然没有解决。最后,当我也按照其他人在shell中提到的相同顺序导入时,该测试有效。

我必须最后导入datetime,然后才开始工作。