我正在尝试将一个相当大的Django项目升级到新发布的Django 1.4,并且在运行python manage.py test
时遇到了一些问题。
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)),
当我在Google上搜索这个错误时,我所能找到的只是人们使用旧方案导入管理url,而与这个问题没有任何关系。
我已经尝试过一个接一个地从INSTALLED_APPS
中删除应用程序,但是身份验证测试根本无法通过。另外,当我从python manage.py shell
加载Python解释器并执行reverse('admin:index')
时,URL解析为/admin/
,没有错误。我已经阅读了大量的代码,但看不出哪里会出现这种情况。
正如我前面提到的,这并不是唯一发生的错误。我也从test_site_profile_not_available (django.contrib.auth.tests.models.ProfileTestCase)
测试中获得AttributeError: AUTH_PROFILE_MODULE
,即使AUTH_PROFILE_MODULE
是在我的settings.py
文件中定义的。Django自己的测试怎么会这样失败呢?
尝试在url.py文件的include方法中添加namespace=“admin”。
例如:url(r'^admin/',include(“someUrlpattern”,namespace=“admin”))
事实证明,这是由于我的设置文件中的
TEMPLATE_LOADERS
键的顺序造成的。我有以下几点:
这在某种程度上导致了反向管理url时的错误。切换两回合解决了这个问题。我很想知道这是怎么发生的,因为它在一个空白的Django 1.4项目中是不可复制的。
然而,是可重复的,是
settings.AUTH_PROFILE_MODULE
的AttributeError
。原来这是Django 1.4中的一个bug,它是在发布日提交的。简短回答:您的应用程序的模板目录中有一个从早期版本的Django复制的Django管理模板文件的副本,然后您升级了Django,但没有更新(重新复制)那些本地模板。
长答案:此问题的主要原因是使用较旧版本的Django管理模板文件(这些文件安装在Django本身所在的位置,通常是python的
site-packages
或dist-packages
目录)。Django 1.5中有一个关于url模板标记的向后不兼容更改,其中第一个参数必须是来自Django 1.5 release notes的字符串:所以,问题是你的应用的一个模板文件夹中有一个管理员模板文件的副本,这个文件夹是从Django的早期版本复制过来的。这通常是为了覆盖默认的管理模板。由于注意到向后不兼容的更改,这些过时的模板文件无法在较新的Django环境中加载,并导致奇怪的错误:
NoReverseMatch: u'admin' is not a registered namespace
。更改
TEMPLATE_LOADERS
项的顺序将忽略本地管理模板修改,而使用默认模板文件(因为默认Django模板是通过filesystem.Loader
的完整路径加载的)。如果需要修改(通常是这样),则必须从新的Django安装模板更新本地管理模板文件,并重新应用修改。注意1:类似的情况是本地管理模板比Django安装的默认模板更新,这似乎是您的情况。类似地,更好的解决方案是更新管理模板的所有副本。
注意2:使用virtualenv时可能会出现这种错误。例如,如果使用virtualenv运行项目,但Django管理模板的
TEMPLATE_DIRS
条目是全局python安装的,则可能会出现此错误。相关问题 更多 >
编程相关推荐