Django:对象没有属性'was_published_recently' -除非它有

qxsslcnc  于 2023-01-18  发布在  Go
关注(0)|答案(5)|浏览(203)

this post类似但不相同的问题。
刚接触Django的时候,我一直在做第一个教程,现在已经到了第五部分,自动化测试。
按照教程直到步骤"修复Bug"之后,当我运行测试时,它弹出了一个错误,如下所示:

Creating test database for alias 'default'...
E
======================================================================
ERROR: test_was_published_recently_with_future_question (polls.tests.QuestionModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/ian/mysite/polls/tests.py", line 18, in test_was_published_recently_with_future_question
    self.assertIs(future_question.was_published_recently(), False)
AttributeError: 'Question' object has no attribute 'was_published_recently'

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)
Destroying test database for alias 'default'...

下面是我的代码:

    • 测试. py**
import datetime

from django.utils import timezone
from django.test import TestCase

from .models import Question

class QuestionModelTests(TestCase):

    def test_was_published_recently_with_future_question(self):
        """
        was_published_recently() returns False for questions whose pub_date
        is in the future.
        """
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(pub_date=time)
        self.assertIs(future_question.was_published_recently(), False)
    • 型号. py**
import datetime

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

class Question(models.Model):
    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    def __str__(self):
        return self.choice_text

    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
hgtggwj0

hgtggwj01#

你需要CTRL+ D(停止)你的python控制台,然后再次运行python manage.py shell,最后再次导入所有的文件。

p3rjfoxz

p3rjfoxz2#

试着这样做这对我很有帮助
民意调查/models.py

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

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

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

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
# Create your models here.
t1rydlwq

t1rydlwq3#

除非Django在Model类中做了一些魔法(很有可能),否则python不会定义带有pub_date属性的Question对象的创建。

xoshrz7s

xoshrz7s4#

尝试:exit().退出python shell。
然后重新调用Pythonshell,导入模型类,这个方法应该可以工作。

slwdgvem

slwdgvem5#

变更

future_question = Question(pub_date=time)

future_question = Question.objects.get(pub_date=time)

相关问题