官方Django教程,测试客户端,上下文

时间:2016-03-01 08:17:44

标签: python django

我正在尝试做'传奇'的django教程,并遇到了一些问题。首先,我是Stage 5 - Testing,并通过交互式shell探索Django测试客户端。我遇到的具体问题与请求有关:

>>> response.context['latest_question_list']

我得到的回应是

 Traceback (most recent call last):
     File "<console>", line 1, in <module>
 TypeError: 'NoneType' object has no attribute '__getitem__'

在此阶段之前一切正常,但忽略了问题并试图继续,我认为这可能是导致课程进一步失误的原因。

我对Python和Django都很陌生,而且从我到目前为止的挖掘中,已经发现上下文,在本例中是['latest_question_list'],表现为字典,附加了问题,所以我的问题这就是为什么这本词典中没有任何内容?

这是我的views.py中的代码,我认为该代码负责该功能:

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.views import generic

from .models import Choice, Question


class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        """Return the last five published questions."""
        return Question.objects.order_by('-pub_date')[:5]

如果这个问题写得不好,我很抱歉,因为这是我第一次。此外,对于任何更好奇或需要有关我的代码的更多信息的人,请点击此git的链接,其中包含最新的示例 - Github.

非常感谢任何有耐心帮助我解决这个问题的人。

-------------&GT;&GT; Ammendment

在jpic的答案的基础上,希望这解释了我如何获得响应对象:

>>> from django.test import Client
>>> # create an instance of the client for our use
>>> client = Client()
>>> # get a response from '/'
>>> response = client.get('/')
>>> from django.core.urlresolvers import reverse
>>> response = client.get(reverse('polls:index'))
>>> from polls.models import Question
>>> from django.utils import timezone
>>> response = client.get('/polls/')
>>> response.content
>>> response.context['latest_question_list']

我希望这可以回答你的问题。非常感谢您快速回来!再次为格式化道歉。

2 个答案:

答案 0 :(得分:3)

欢迎!

您的问题的问题在于,您没有向我们展示如何获得与您自己相同的响应对象,因此,我们无法重现您的问题。

您的上下文对象的问题在于它是无,在您的情况下,request.context为None,因此&#39; [...]&#39; - 调用App::bind('Vanguard\Repositories\Factory\FactoryRepository', 'Vanguard\Repositories\Country\EloquentCountry'); - 失败因此异常&#34; NoneType没有属性__getitem__&#34;。

对我来说,django测试客户的反应有一个背景可以:

__getitem__

要在我的测试中使用此调试器,这是我添加到polls / test.py的代码:

$ ./manage.py test polls
Creating test database for alias 'default'...
.WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
--Return--
None
> /tmp/04_django_intro/mysite/polls/tests.py(43)test_index()
     41     def test_index(self):
     42         response = self.client.get('/')
---> 43         import ipdb; ipdb.set_trace()

ipdb> response.context
[{'False': False, 'None': None, 'True': True}, {'exception': 'Resolver404', 'request_path': u'/'}]
ipdb> c
...
----------------------------------------------------------------------
Ran 4 tests in 5.121s

OK
Destroying test database for alias 'default'...

请勿忘记def test_index(self): response = self.client.get('/') import ipdb; ipdb.set_trace() ,或在此使用pip install ipdb代替pdb

此外,如果您还没有,请考虑阅读PEP8PEP0257,但也许您在启动民意调查/ tests.py后阅读了它。

答案 1 :(得分:1)

如果使用Jinja2模板而不是DTL,也会出现OP描述的问题。 因此,如果您已经在教程中进行了操作但已修改settings.py以使用jinja2,那么您将在python shell中拥有以下行:

import django
django.setup()
from django.test.utils import setup_test_environment
setup_test_environment()
from django.test import Client
# create an instance of the client for our use
client = Client()
# get a response from '/'
response = client.get('/')
==> Not Found: /
response.status_code
==> 404
from django.urls import reverse
response = client.get(reverse('polls:index'))
response.status_code
==> 200
response.context['latest_question_list']
==> Traceback (most recent call last):
      Python Shell, prompt 12, line 1
    builtins.TypeError: 'NoneType' object is not subscriptable

如您所见,response.context为无,因为Jinja2尚未填充它。而是在使用Jinja2时使用context_data

response.context_data['latest_question_list']
==> <QuerySet [<Question: What's up?>]>