【问题标题】:KeyError when unittesting Django views/URLs单元测试 Django 视图/URL 时出现 KeyError
【发布时间】:2017-10-04 17:56:37
【问题描述】:

我正在尝试在 Django 1.11 中测试 URL/视图,并不断收到一些似乎与 URL 命名空间相关的错误。项目主 URLs 文件中定义的命名空间和应用程序的 URLs 文件中定义的本地 URL 名称与我在测试中放置的内容相匹配,并且在模板中看起来也很好。我通过查看文档尝试了一些事情,但不知道发生了什么。非常感谢您的帮助,谢谢。

我对 URL/视图的测试:

from django.test import TestCase, Client
from .models import Course, Step
from django.utils import timezone
from django.core.urlresolvers import reverse, resolve

...
...

class CourseViewsTests(TestCase):
    def setUp(self):
        self.course = Course.objects.create(
            title="Python Testing",
            description="Sample description"
        )
        self.course2 = Course.objects.create(
            title="New Course",
            description="New course description"
        )
        self.step = Step.objects.create(
            title="Intro to Doctests",
            description="Learn to write tests in your docstrings",
            course=self.course
        )

        # self.client = Client()

    def test_course_list_view(self):
        resp = self.client.get(reverse('courses:list'))
        self.assertEqual(resp.status_code, 200)
        self.assertIn(self.course, resp.context['courses'])
        self.assertIn(self.course2, resp.context['courses'])

我的根urls.py

from django.conf.urls import url
from django.contrib import admin
from . import views
from django.conf.urls import include
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns = [
    url(r'^courses/', include('courses.urls', namespace="courses")),
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.home, name="home"),
]

urlpatterns += staticfiles_urlpatterns()

我的“课程”应用urls.py

urlpatterns = [
    url(r'^$', views.course_list, name="list"),
    url(r'(?P<course_pk>\d+)/(?P<step_pk>\d+)/$', views.step_detail, name="step"),
    url(r'(?P<pk>\d+)/$', views.course_detail, name="detail"),
]

正在渲染的模板:

{% extends "layout.html" %}

{% block title %}Available Courses{% endblock %}
{% block content %}
<div class="cards">
    {% for course in courses %}
    <div class="card">
        <header><a href="{% url 'courses:detail' pk=course.pk %}">{{ course.title }}</a></header>
        <div class="card-copy">
            {{ course.description }}
        </div>
    </div>
    {% endfor %}
</div>
{% endblock %}

最后是我的回溯:

Traceback (most recent call last):
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/urls/base.py", line 77, in reverse
    extra, resolver = resolver.namespace_dict[ns]
KeyError: 'course'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/learning_site/courses/tests.py", line 59, in test_course_list_view
    resp = self.client.get(reverse('courses:list'))
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/test/client.py", line 536, in get
    **extra)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/test/client.py", line 340, in get
    return self.generic('GET', path, secure=secure, **r)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/test/client.py", line 416, in generic
    return self.request(**r)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/test/client.py", line 501, in request
    six.reraise(*exc_info)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/utils/six.py", line 686, in reraise
    raise value
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/learning_site/courses/views.py", line 6, in course_list
    return render(request, 'courses/course_list.html', {'courses': courses})
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/shortcuts.py", line 30, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/loader.py", line 68, in render_to_string
    return template.render(context, request)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/backends/django.py", line 66, in render
    return self.template.render(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/base.py", line 207, in render
    return self._render(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/test/utils.py", line 107, in instrumented_test_render
    return self.nodelist.render(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/base.py", line 990, in render
    bit = node.render_annotated(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/base.py", line 957, in render_annotated
    return self.render(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/loader_tags.py", line 177, in render
    return compiled_parent._render(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/test/utils.py", line 107, in instrumented_test_render
    return self.nodelist.render(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/base.py", line 990, in render
    bit = node.render_annotated(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/base.py", line 957, in render_annotated
    return self.render(context)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/template/defaulttags.py", line 458, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "/Users/Adam/Desktop/Treehouse/DjangoBasics/djangobasics/lib/python3.5/site-packages/django/urls/base.py", line 87, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)
django.urls.exceptions.NoReverseMatch: 'course' is not a registered namespace

【问题讨论】:

  • 您确定您的模板中没有课程命名空间吗?也许尝试清理 pyc 文件或 smth。可见的代码看起来不错,所以我们看不到的代码肯定有问题。
  • 感谢@mariodev 参与进来。刚刚尝试清除所有pyc 文件并再次运行测试,得到了相同的结果。
  • 天哪。我想到了。这是我的布局模板的问题。再次感谢@mariodev!

标签: python django


【解决方案1】:

愚蠢的菜鸟问题——Django 试图渲染我的 layout.html 模板,我从未检查过它,因为我认为那里一切正常,而且我的网址名称之一错误。

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2012-11-27
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2018-07-27
    • 2014-07-14
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多