django manage.py测试验证失败

django manage.py测试验证失败,django,testing,authentication,Django,Testing,Authentication,当我运行django的测试套件时,我在auth应用程序上得到错误。我(显然)没有编写任何auth代码,也没有为auth编写测试。然而,身份验证测试失败了。以下是我得到的一些错误,整个stacktrace太大,无法放在这里: 以前有人处理过这个问题吗 AttributeError: 'module' object has no attribute 'handler500' DoesNotExist: UserProfile matching query does not exist. ----

当我运行django的测试套件时,我在auth应用程序上得到错误。我(显然)没有编写任何auth代码,也没有为auth编写测试。然而,身份验证测试失败了。以下是我得到的一些错误,整个stacktrace太大,无法放在这里: 以前有人处理过这个问题吗

AttributeError: 'module' object has no attribute 'handler500'

DoesNotExist: UserProfile matching query does not exist.

----------------------------------------------------------------------
Ran 30 tests in 3.813s

FAILED (errors=17)
Destroying test database...

我想出来了。如果auth应用程序使用复杂的模板呈现默认的auth模板视图,则auth测试中的测试失败。auth应用程序使用应用程序使用的模板进行自我测试。我已将默认设置更改为与网站其他部分相同的模板

我在模板中犯的错误:

  • 使用auth应用程序未知的变量和反向URL。 在我的例子中,它包含auth模板中的用户配置文件信息(当然,在您未登录时不可用)和导致auth应用程序测试出错的错误url反向标记
当我放弃了所有在基本身份验证模板上毫无用处的东西时,所有身份验证测试再次成功

正因为如此,我学到了另一个教训:

在模板中分离内容和结构是很有用的。创建一个base.html模板文件很容易做到这一点,该文件只定义一个基本的html页面结构,并包含一组内容块。请参见下面的示例代码:

下一步是创建一个base_content.html,它扩展base.html,只定义用于将内容呈现到页面中的块。每一页都需要简单的基本内容

在应用程序中,您可以扩展base_content.html并填充剩余的空内容块,或者用新内容块覆盖它们。。 使用此技术可以非常轻松地创建扩展base_content.html的auth模板 或base.html作为非常基本的身份验证模板,因此大部分(无用的)内容被忽略

示例base.html

<body>
<div id="header">  
{% block mainmenu %}{% endblock %}
</div>
<div id="userbar">
 {% block userbar %}{% endblock %}
</div>
<div id="bigcontent">
    {% block bigcontent %}{% endblock %}
</div>
</body>
现在,我的应用程序中的所有模板都扩展了基本内容模板,该模板包含显示在每个页面上的内容。 这样你就不会重复你自己,你的模板代码也会变得非常枯燥,只需使用base.content模板进行身份验证就可以使身份验证测试成功

  {% extends "base.html" %}
  {% load i18n %}
  {% block mainmenu %}
       ...content..
  {% endblock %}