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

Rob*_*ing 17 python django django-1.4

我正在尝试将相当大的Django项目升级到新发布的Django 1.4,我在运行时遇到了一些问题python manage.py test.

在Django 1.3中传递的大量内部测试现在都失败了,真正奇怪的消息似乎无法解决.看起来最多的是:

NoReverseMatch: u'admin' is not a registered namespace
Run Code Online (Sandbox Code Playgroud)

这是django.contrib.auth针对密码更改的测试而提出的(其中一个是test_password_change_fails_with_mismatched_passwords (django.contrib.auth.tests.views.ChangePasswordTest).奇怪的是,命名空间已正确注册,应用程序运行正常.我以"新"方式导入管理员:

url(r'^admin/', include(admin.site.urls)),
Run Code Online (Sandbox Code Playgroud)

特别是当我谷歌这个错误时,我所能找到的是使用旧方案导入管理URL的人,并且根本不涉及这个问题.

我已经尝试INSTALLED_APPS逐个删除应用程序,但auth测试根本无法通过.此外,当我从中加载Python解释器python manage.py shell并执行reverse('admin:index')URL解析为/admin/没有错误.我已经广泛阅读了这段代码,但却无法看到它可能会落空的地方.

正如我之前提到的,这不是唯一发生的错误.即使在我的文件中定义,我也AttributeError: AUTH_PROFILE_MODULEtest_site_profile_not_available (django.contrib.auth.tests.models.ProfileTestCase)测试AUTH_PROFILE_MODULE中获益settings.py.Django自己的测试怎么会像这样失败?

Ami*_*ari 15

简答:您有一个Django管理模板文件的副本从早期版本的Django复制到您的应用程序的模板目录中,然后您升级了Django但没有更新(重新复制)这些本地模板.

长答案:这个问题的主要原因是使用旧版本的Django管理模板文件(安装了django本身,通常是python site-packagesdist-packages目录).Django 1.5中有一个关于url模板标记的向后不兼容的更改,其中第一个参数必须是一个字符串,来自Django 1.5发行说明:

一个值得注意的弃用功能是转向"新式"url标签.在Django 1.3之前,{%url myview%}之类的语法被错误地解释(Django将"myview"视为视图的文字名称,而不是名为myview的模板变量).Django 1.3及以上版本引入了{%load url from future%}语法,以引入已将myview视为变量的更正行为.

因此,问题是您在应用程序的模板文件夹中有一份管理员模板文件的副本,该文件夹是从早期版本的Django中获得的.这通常用于覆盖默认管理模板.由于注意到了向后不兼容的更改,这些过时的模板文件无法在较新的Django环境中加载,并导致奇怪的错误:NoReverseMatch: u'admin' is not a registered namespace.

更改TEMPLATE_LOADERS条目的顺序将忽略本地管理模板修改,而不是默认模板文件(因为默认的Django模板是通过完整路径加载的filesystem.Loader).如果需要进行修改(通常是这种情况),则必须从新的Django安装模板更新本地管理模板文件,然后在其上重新应用修改.

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

注2:获得此类错误的另一种可能性是使用virtualenv时.例如,如果您使用virtualenv运行项目,但TEMPLATE_DIRSDjango管理模板的条目是您的全局python安装,则可能会出现此错误.


Rob*_*ing 9

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

我有以下内容:

TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.Loader',
    'django.template.loaders.filesystem.Loader',
)
Run Code Online (Sandbox Code Playgroud)

在某种程度上,在撤消管理URL时会导致错误.切换两轮解决了这个问题.我很想知道这是如何发生的,因为它在一个空白的Django 1.4项目中是不可重现的.

什么可重复的,然而,是AttributeErrorsettings.AUTH_PROFILE_MODULE.原来这是在Django 1.4的一个bug,提交于发布当天在这里.


小智 5

尝试在urls.py文件中的include方法中添加namespace ="admin".

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