我正在尝试做'传奇'的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']
我希望这可以回答你的问题。非常感谢您快速回来!再次为格式化道歉。
答案 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
。
答案 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?>]>