Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法在django中包含来自我的应用程序的URL_Python_Django_Tdd - Fatal编程技术网

Python 无法在django中包含来自我的应用程序的URL

Python 无法在django中包含来自我的应用程序的URL,python,django,tdd,Python,Django,Tdd,我正在使用Python进行TDD web开发,以学习Django。它基于Django1.8,但我尝试在Django1.11上遵循它。自1.8版以来,似乎有太多的变化。在作者要求我为我的应用程序创建一个单独的URL.py文件之前,我的应用程序(列表)工作得很好。现在,所有测试都以404错误失败 我的URL.py是 from django.conf.urls import url, include from lists import views as list_views urlpatterns

我正在使用Python进行TDD web开发,以学习Django。它基于Django1.8,但我尝试在Django1.11上遵循它。自1.8版以来,似乎有太多的变化。在作者要求我为我的应用程序创建一个单独的URL.py文件之前,我的应用程序(列表)工作得很好。现在,所有测试都以404错误失败

我的URL.py是

from django.conf.urls import url, include
from lists import views as list_views

urlpatterns = [
    url(r'^$', list_views.home_page, name='home'),
    url(r'^lists/', include('lists.urls')),
]
和我的列表/url.py

from django.conf.urls import url
from lists import views as list_views

app_name = 'lists'
urlpatterns = [
    url(r'^lists/(\d+)/$', list_views.view_list, name = 'view_list'),
    url(r'^lists/(\d+)/add_item$', list_views.add_item, name = 'add_item'),
    url(r'^lists/new$', list_views.new_list, name = 'new_list'),
]
这些是我产生错误的测试

class ListAndItemModelsTest(TestCase):

    def test_saving_and_retrieving_items(self):
        list_ = List()
        list_.save()

        first_item = Item()
        first_item.text = 'The first (ever) list item'
        first_item.list = list_
        first_item.save()

        second_item = Item()
        second_item.text = 'Item the second'
        second_item.list = list_
        second_item.save()

        saved_list = List.objects.first()
        self.assertEqual(saved_list, list_)

        saved_items = Item.objects.all()
        self.assertEqual(saved_items.count(), 2)

        first_saved_item = saved_items[0]
        second_saved_item = saved_items[1]
        self.assertEqual(first_saved_item.text, 'The first (ever) list item')
        self.assertEqual(first_saved_item.list, list_)
        self.assertEqual(second_saved_item.text, 'Item the second')
        self.assertEqual(second_saved_item.list, list_)

class ListViewTest(TestCase):

    def test_uses_list_template(self):
        list_ = List.objects.create()
        response = self.client.get('/lists/%d/' % (list_.id,))
        self.assertTemplateUsed(response, 'list.html')

    def test_displays_only_items_for_that_list(self):
        correct_list = List.objects.create()
        Item.objects.create(text = 'itemey 1', list = correct_list)
        Item.objects.create(text = 'itemey 2', list = correct_list)

        other_list = List.objects.create()
        Item.objects.create(text = 'other list item 1', list = other_list)
        Item.objects.create(text = 'other list item 2', list = other_list)

        response = self.client.get('/lists/%d/' % (correct_list.id,))

        self.assertContains(response, 'itemey 1')
        self.assertContains(response, 'itemey 2')
        self.assertNotContains(response, 'other list item 1')
        self.assertNotContains(response, 'other list item 2')

    def test_passes_correct_list_to_template(self):
        other_list = List.objects.create()
        correct_list = List.objects.create()
        response = self.client.post('/lists/%d/' % (correct_list.id,))
        self.assertEqual(response.context['list'], correct_list)

class NewListTest(TestCase):

    def test_saving_a_POST_request(self):

        response = self.client.post(
                '/lists/new',
                data = {'item_text': 'A new list item'}
            )

        self.assertEqual(Item.objects.count(), 1)
        new_item = Item.objects.first()
        self.assertEqual(new_item.text, 'A new list item')

    def test_redirects_after_POST(self):

        response = self.client.post(
                '/lists/new',
                data = {'item_text': 'A new list item'}
            )

        new_list = List.objects.first()

        self.assertRedirects(response, '/lists/%d/' % (new_list.id,))

class NewItemTest(TestCase):

    def test_can_save_a_POST_request_to_an_existing_list(self):
        other_list = List.objects.create()
        correct_list = List.objects.create()

        self.client.post(
                '/lists/%d/add_item' % (correct_list.id,),
                data = {'item_text': 'A new item for an existing list'}
            )

        self.assertEqual(Item.objects.count(), 1)
        new_item = Item.objects.first()
        self.assertEqual(new_item.text, 'A new item for an existing list')
        self.assertEqual(new_item.list, correct_list)

    def test_redirects_to_list_view(self):
        other_list = List.objects.create()
        correct_list = List.objects.create()

        response = self.client.post(
                '/lists/%d/add_item' % (correct_list.id,),
                data = {'item_text': 'A new item for an existing list'}
            )

        self.assertRedirects(response, '/lists/%d/' % (correct_list.id,))
这些错误发生在我运行测试时

ERROR: test_passes_correct_list_to_template (lists.tests.ListViewTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 78, in test_passes_correct_list_to_template
    self.assertEqual(response.context['list'], correct_list)
  File "/home/abhi/.local/lib/python3.5/site-packages/django/template/context.py", line 87, in __getitem__
    raise KeyError(key)
KeyError: 'list'

======================================================================
ERROR: test_redirects_after_POST (lists.tests.NewListTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 102, in test_redirects_after_POST
    self.assertRedirects(response, '/lists/%d/' % (new_list.id,))
AttributeError: 'NoneType' object has no attribute 'id'

======================================================================
FAIL: test_displays_only_items_for_that_list (lists.tests.ListViewTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 69, in test_displays_only_items_for_that_list
    self.assertContains(response, 'itemey 1')
  File "/home/abhi/.local/lib/python3.5/site-packages/django/test/testcases.py", line 385, in assertContains
    response, text, status_code, msg_prefix, html)
  File "/home/abhi/.local/lib/python3.5/site-packages/django/test/testcases.py", line 357, in _assert_contains
    " (expected %d)" % (response.status_code, status_code)
AssertionError: 404 != 200 : Couldn't retrieve content: Response code was 404 (expected 200)

======================================================================
FAIL: test_uses_list_template (lists.tests.ListViewTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 56, in test_uses_list_template
    self.assertTemplateUsed(response, 'list.html')
  File "/home/abhi/.local/lib/python3.5/site-packages/django/test/testcases.py", line 578, in assertTemplateUsed
    self.fail(msg_prefix + "No templates used to render the response")
AssertionError: No templates used to render the response

======================================================================
FAIL: test_can_save_a_POST_request_to_an_existing_list (lists.tests.NewItemTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 115, in test_can_save_a_POST_request_to_an_existing_list
    self.assertEqual(Item.objects.count(), 1)
AssertionError: 0 != 1

======================================================================
FAIL: test_redirects_to_list_view (lists.tests.NewItemTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 129, in test_redirects_to_list_view
    self.assertRedirects(response, '/lists/%d/' % (correct_list.id,))
  File "/home/abhi/.local/lib/python3.5/site-packages/django/test/testcases.py", line 294, in assertRedirects
    % (response.status_code, status_code)
AssertionError: 404 != 302 : Response didn't redirect as expected: Response code was 404 (expected 302)

======================================================================
FAIL: test_saving_a_POST_request (lists.tests.NewListTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 89, in test_saving_a_POST_request
    self.assertEqual(Item.objects.count(), 1)
AssertionError: 0 != 1

感谢您的帮助。谢谢大家!

您可以尝试删除url模式中的
列表
,就像您在主
url.py中提供的那样:

urlpatterns = [
    url(r'^(\d+)/$', list_views.view_list, name = 'view_list'),
    url(r'^(\d+)/add_item$', list_views.add_item, name = 'add_item'),
    url(r'^new$', list_views.new_list, name = 'new_list'),
]

您需要从中重写测试

.get('/lists/
双重名单

.get('/lists/lists/
#            ^^^^^^
或最佳使用方式,例如:

from django.urls import reverse
# Some your code
# instead of response = self.client.get('/lists/%d/' % (list_.id,))
url = reverse('lists:view_list', args=[list_.id])
response = self.client.get(url)

您需要添加您的测试添加请求的测试,但我不认为他们的测试有问题,在我分离应用程序的URL之前,他们工作正常。在我创建单独的URL.py文件之前,我的测试正常。请检查我在主URL文件中的include位是否正确如果您需要按原样保存测试,您需要在PRMoureu的答案中执行操作,否则请尝试我的答案中的逻辑谢谢您的回答。一开始我误解了你。但是,它现在起作用了