如何修复此python错误“全局名称'create_question'未定义”

时间:2015-12-18 02:31:03

标签: python django

我正在关注Django测试的教程。 Pycharm从test.py中的代码中抛出错误。

create_question 

中的

QuestionViewTests(TestCase) 

QuestionIndexDetailTests(TestCase) class's have are all throwing errors. But the 

create_question 

里面的

QuestionMethodTests(TestCase)

班级有效。我有打字,复制和粘贴,它仍然无法正常工作。我也试过File>使高速缓存失效...并重新启动PyCharm,但这也无效。我也对课程感到困惑

 QuestionViewTests(TestCase)

QuestionIndexDetailTests(TestCase) 

他们是否在上面列出的第一类

QuestionMethodTests(TestCase) 

因为它在我不知道的网站上的样子。我已将它们都移入和移出课程,但它仍无法正常工作。欢迎提出任何建议。

我的代码

    import datetime

    from django.utils import timezone
    from django.test import TestCase
    from django.core.urlresolvers import reverse
    from .models import Question


    class QuestionMethodTests(TestCase):

        def test_was_published_recently_with_future_question(self):
            """
            was_published_recently() should return False for questions whose
            pub_date is in the future.
            """
            time = timezone.now() + datetime.timedelta(days=30)
            future_question = Question(pub_date=time)
            self.assertEqual(future_question.was_published_recently(), False)

        def test_was_published_recently_with_old_question(self):
            """
            was_published_recently() should return False for questions whose
            pub_date is older than 1 day.
            """
            time = timezone.now() - datetime.timedelta(days=30)
            old_question = Question(pub_date=time)
            self.assertEqual(old_question.was_published_recently(), False)

        def test_was_published_recently_with_recent_question(self):
            """
            was_published_recently() should return True for questions whose
            pub_date is within the last day.
            """
            time = timezone.now() - datetime.timedelta(hours=1)
            recent_question = Question(pub_date=time)
            self.assertEqual(recent_question.was_published_recently(), True)

        def create_question(question_text, days):
            """
            Creates a question with the given `question_text` and published the
            given number of `days` offset to now (negative for questions published
            in the past, positive for questions that have yet to be published).
            """
            time = timezone.now() + datetime.timedelta(days=days)
            return Question.objects.create(question_text=question_text, pub_date=time)


    class QuestionViewTests(TestCase):
        def test_index_view_with_no_questions(self):
            """
            If no questions exist, an appropriate message should be displayed.
            """
            response = self.client.get(reverse('polls:index'))
            self.assertEqual(response.status_code, 200)
            self.assertContains(response, "No polls are available.")
            self.assertQuerysetEqual(response.context['latest_question_list'], [])

        def test_index_view_with_a_past_question(self):
            """
            Questions with a pub_date in the past should be displayed on the
            index page.
            """
            create_question(question_text="Past question.", days=-30)
            response = self.client.get(reverse('polls:index'))
            self.assertQuerysetEqual(
                response.context['latest_question_list'],
                ['<Question: Past question.>']
            )

        def test_index_view_with_a_future_question(self):
            """
            Questions with a pub_date in the future should not be displayed on
            the index page.
            """
            create_question(question_text="Future question.", days=30)
            response = self.client.get(reverse('polls:index'))
            self.assertContains(response, "No polls are available.", status_code=200)
            self.assertQuerysetEqual(response.context['latest_question_list'], [])

        def test_index_view_with_future_question_and_past_question(self):
            """
            Even if both past and future questions exist, only past questions
            should be displayed.
            """
            create_question(question_text="Past question.", days=-30)
            create_question(question_text="Future question.", days=30)
            response = self.client.get(reverse('polls:index'))
            self.assertQuerysetEqual(
                response.context['latest_question_list'],
                ['<Question: Past question.>']
            )

        def test_index_view_with_two_past_questions(self):
            """
            The questions index page may display multiple questions.
            """
            create_question(question_text="Past question 1.", days=-30)
            create_question(question_text="Past question 2.", days=-5)
            response = self.client.get(reverse('polls:index'))
            self.assertQuerysetEqual(
                response.context['latest_question_list'],
                ['<Question: Past question 2.>', '<Question: Past question 1.>']
            )

    class QuestionIndexDetailTests(TestCase):
        def test_detail_view_with_a_future_question(self):
            """
            The detail view of a question with a pub_date in the future should
            return a 404 not found.
            """
            future_question = create_question(question_text='Future question.',
                                              days=5)
            response = self.client.get(reverse('polls:detail',
                                       args=(future_question.id,)))
            self.assertEqual(response.status_code, 404)

        def test_detail_view_with_a_past_question(self):
            """
            The detail view of a question with a pub_date in the past should
            display the question's text.
            """
            past_question = create_question(question_text='Past Question.',
                                            days=-5)
            response = self.client.get(reverse('polls:detail',
                                       args=(past_question.id,)))
            self.assertContains(response, past_question.question_text,
                                status_code=200)

2 个答案:

答案 0 :(得分:2)

您缩进了create_question的定义,因此它看起来像QuestionMethodTests的成员。基本上你这样做了:

class Foo:
    ...

    def create_question(x):
       ...

create_question(3)

当我时,你打算这样做:

class Foo:
    ...

def create_question(x):
    ...

create_question(3)

答案 1 :(得分:1)

create_question的实例未调用QuestionMethodTests的任何来电;它不是一个全局函数,它是QuestionMethodTests实例的方法,所以你需要创建一个QuestionMethodTests对象并调用它。当然,你在self的定义中省略了最初的create_question参数,所以即使你设法调用它,它也不会起作用。

那就是说,create_question看起来并不像成员函数那样有意义;将它移动到文件的顶层(在任何类定义之外)可能就是你想要的;它修复了将其作为实例方法调用的需要,并且您不需要添加self作为参数。