“admin”不是Django 1.4中注册的命名空间

2024-04-27 02:58:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个相当大的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自己的测试怎么会这样失败呢?


Tags: djangopytestauthurlmanageadmin错误
3条回答

尝试在url.py文件的include方法中添加namespace=“admin”。

例如:url(r'^admin/',include(“someUrlpattern”,namespace=“admin”))

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

我有以下几点:

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

这在某种程度上导致了反向管理url时的错误。切换两回合解决了这个问题。我很想知道这是怎么发生的,因为它在一个空白的Django 1.4项目中是不可复制的。

然而,是可重复的,是settings.AUTH_PROFILE_MODULEAttributeError。原来这是Django 1.4中的一个bug,它是在发布日提交的。

简短回答:您的应用程序的模板目录中有一个从早期版本的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运行项目,但Django管理模板的TEMPLATE_DIRS条目是全局python安装的,则可能会出现此错误。

相关问题 更多 >