2012-03-26 89 views
17

我试图将相当大的Django项目升级到新发布的Django 1.4,并且在运行python manage.py test时遇到了一些问题。'管理员'不是Django 1.4中的注册名称空间

很多在Django 1.3中传递的内部测试现在都失败了,我看起来似乎无法解决很多奇怪的消息。出现的最之一是:

NoReverseMatch: u'admin' is not a registered namespace 

这是募投django.contrib.auth测试在特定密码更改(其中一个是test_password_change_fails_with_mismatched_passwords (django.contrib.auth.tests.views.ChangePasswordTest)奇怪的是,该命名空间是正确注册和应用功能就好了。我在“新”的方式进口管理:

url(r'^admin/', include(admin.site.urls)), 

当我谷歌这个错误特别是,所有我能找到的关于这个问题,在所有的人使用旧的方案导入管理网址,并没有什么。

我试过从INSTALLED_APPS一个一个地移除应用程序,但auth测试根本不会通过。另外,当我从python manage.py shell加载Python解释器并执行reverse('admin:index')时,URL解析为/admin/而没有错误。我已经详细阅读了代码,并且无法看到可能会崩溃的位置。

正如我前面提到的,这不是唯一发生的错误。即使在我的settings.py文件中定义了AUTH_PROFILE_MODULE,我也会从test_site_profile_not_available (django.contrib.auth.tests.models.ProfileTestCase)测试中获得AttributeError: AUTH_PROFILE_MODULE。 Django自己的测试如何失败?

+1

有一些错误代码。在正常情况下,Django测试不会失败。你只需要仔细检查一切。我有一个类似的错误,结果与我的一个urlpatterns中的不平衡括号有关。 – 2012-03-26 15:57:50

+0

你最终发现了什么?我诚实地走进了这样的事情,我不知道发生了什么。我结束了不得不将管理模板的东西移动到我自己的应用程序目录。 – stormlifter 2012-07-17 18:01:24

+1

我对于一些django 1.5测试有同样的错误,比如test_middleware_disabled。我试图扭转TEMPLATE_LOADERS的命令,在接受答案的建议,我已经从我的应用程序的模板目录删除我的管理模板(由埃米尔的建议),但我仍然得到错误。 – 2014-02-12 22:23:54

回答

9

事实证明,这是由于我的设置文件中的TEMPLATE_LOADERS键的顺序。

我有以下几点:

TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.Loader', 
    'django.template.loaders.filesystem.Loader', 
) 

其中,不知何故,倒车管理URL时造成的错误。切换两轮解决了问题。我很想知道这是如何发生的,因为它在一个空白的Django 1.4项目中是不可重现的。

什么可重复的,但是, settings.AUTH_PROFILE_MODULE。原来,这是Django 1.4中的一个bug,它在发布日here上提交。

+0

AttributeError bug有什么解决方法吗? – acjay 2012-09-04 06:09:06

+0

我还没有找到一个 - 但我很想知道是否有办法可以完成。我对这个问题的低优先级感到沮丧,因为它阻止了使用TDD或持续集成来测试代码。 我试图创建一个自定义的测试运行器,特别是会跳过这个测试,但无法正常工作。我知道的唯一解决方案是哪一个(这不太理想)是只测试你自己的应用程序。如果你使用'django-nose',这是默认行为。 – 2012-09-04 10:07:01

2

app_directories模板加载器从INSTALLED_APPS模板目录中加载模板,而文件系统加载器从TEMPLATE_DIRS设置中配置的模板目录加载它们。

切换它们两个会产生巨大的差异,因为如果您的应用中有自定义模板,则它将无法加载,前提是app_directories位于顶部。如果文件系统加载器位于顶部,则django会先从您的模板目录中查找模板,然后再从installed_apps加载默认的模板。

这就是为什么它不能在空白的Django项目中重现。它会在正确的地方寻找模板。

+3

这个问题是关于URLconf错误,而不是模板。这就是为什么我(并且仍然)对修复感到困惑。 – 2012-06-14 14:29:38

14

简短的回答:你从Django的早期版本复制在你的应用程序的模板目录的Django管理模板文件的副本,那么您升级Django的,但没有更新(重新复制)的本地模板。

龙答:这个问题的主要原因是使用Django管理模板文件的旧版本(这是安装位置Django的安装,通常是python的site-packagesdist-packages目录)。有在Django 1.5的向后兼容变更有关URL模板标签,其中第一个参数必须是字符串,从Django 1.5 release notes

One deprecated feature worth noting is the shift to “new-style” url tag. Prior to Django 1.3, syntax like {% url myview %} was interpreted incorrectly (Django considered "myview" to be a literal name of a view, not a template variable named myview). Django 1.3 and above introduced the {% load url from future %} syntax to bring in the corrected behavior where myview was seen as a variable.

所以,问题是你有管理的模板文件的副本中的一个你的应用程序的模板文件夹,从早期版本的Django中复制出来。这通常是为了覆盖默认的管理模板而完成的。由于注意到后向不兼容的更改,这些过时的模板文件无法在较新的Django环境中加载,并导致出现奇怪的错误:NoReverseMatch: u'admin' is not a registered namespace

更改TEMPLATE_LOADERS条目的顺序将忽略本地管理员模板修改,以支持默认模板文件(因为默认的Django模板通过完整路径加载filesystem.Loader)。如果需要修改(通常是这种情况),您必须从新的Django安装模板更新您的本地管理员模板文件,并重新应用您的修改。

注1:类似的情况是,当本地管理模板比Django安装的默认更新时,这似乎是你的情况。同样,更好的解决方法是更新管理模板的所有副本。

注2:获得此类错误的另一种可能性是使用virtualenv时。例如,如果你是一个的virtualenv但TEMPLATE_DIRS条目Django管理模板运行您的项目到全局Python安装,你可能会得到这个错误。

+1

令人惊叹的答案!我希望我可以多次赞扬这个,因为你值得拥有它。 – 2014-02-25 21:47:43

5

尝试在urls.py文件中包括的方法中添加的命名空间=“管理员”。

例如:URL(R '^管理员/',包括( “someUrlpattern”,命名空间= “管理员”))

0

我solutuion是Django的升级到最新的cersion: PIP安装--upgrade的Django == 1.6.1 在此之前,请检查您安装的版本: 画中画冻结| grep Django - 我发现在发布服务器上有一个旧版本,升级解决了这个问题!

0

我有一个类似的错误消息发生在我身上,因为我的网址的conf不得不定义2个logout网址。

urlpatterns = [ 
    url(r'^$', TemplateView.as_view(template_name='home.html'), name='home'), 
    url(r'^api/v1/', include(router.urls)), 
    url(r'^logout/$', auth_views.logout, name='logout'), 
    url(r'^login/$', auth_views.login, {'template_name': 'login.html'}, name='login'), 
    url(r'^logout/$', auth_views.logout, {'template_name': 'logged_out.html'}, name='logout'), 
] 
相关问题