<p><strong>简短回答:</strong>您的应用程序的模板目录中有一个从早期版本的Django复制的Django管理模板文件的副本,然后您升级了Django,但没有更新(重新复制)那些本地模板。</p>
<p><strong>长答案:</strong>此问题的主要原因是使用较旧版本的Django管理模板文件(这些文件安装在Django本身所在的位置,通常是python的<code>site-packages</code>或<code>dist-packages</code>目录)。Django 1.5中有一个关于url模板标记的向后不兼容更改,其中第一个参数必须是来自<a href="https://docs.djangoproject.com/en/dev/releases/1.5/">Django 1.5 release notes</a>的字符串:</p>
<blockquote>
<p>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.</p>
</blockquote>
<p>所以,问题是你的应用的一个模板文件夹中有一个管理员模板文件的副本,这个文件夹是从Django的早期版本复制过来的。这通常是为了覆盖默认的管理模板。由于注意到向后不兼容的更改,这些过时的模板文件无法在较新的Django环境中加载,并导致奇怪的错误:<code>NoReverseMatch: u'admin' is not a registered namespace</code>。</p>
<p>更改<code>TEMPLATE_LOADERS</code>项的顺序将忽略本地管理模板修改,而使用默认模板文件(因为默认Django模板是通过<code>filesystem.Loader</code>的完整路径加载的)。如果需要修改(通常是这样),则必须从新的Django安装模板更新本地管理模板文件,并重新应用修改。</p>
<p><strong>注意1:</strong>类似的情况是本地管理模板比Django安装的默认模板更新,这似乎是您的情况。类似地,更好的解决方案是更新管理模板的所有副本。</p>
<p><strong>注意2:</strong>使用virtualenv时可能会出现这种错误。例如,如果使用virtualenv运行项目,但Django管理模板的<code>TEMPLATE_DIRS</code>条目是全局python安装的,则可能会出现此错误。</p>