带有密码更改视图的模板中的 Django url 错误

Posted

技术标签:

【中文标题】带有密码更改视图的模板中的 Django url 错误【英文标题】:Django url error in template with password_change view 【发布时间】:2011-09-24 15:38:39 【问题描述】:

我正在使用 Django 1.2.3-3+squeeze1 和 Debian 挤压。

我正在尝试在我的应用程序中使用 Django 密码更改视图 对应于django.contrib.auth.views.password_change。这 看起来应该很简单,但我一直有 问题。

为了简单和完整,我将指向我的应用程序文件 在线的。该应用程序是bixfile。这 对应的Django项目是bixproj。

url.py 中的相关行是 https://bitbucket.org/faheem/bixfile/src/49bcbab3a7be/urls.py#cl-65, 即

url(r'^password_change/$', 'django.contrib.auth.views.password_change', 'post_change_redirect':reverse('top_folders'), name="password_change"),

这会破坏使用它的任何模板。目前,我只是 在线使用它 https://bitbucket.org/faheem/bixfile/src/71de33d01f43/templates/calgb_base.html#cl-21 模板 calgb_base.html,包含在一堆 模板包括***索引视图,对应于 模板 https://bitbucket.org/faheem/bixfile/src/71de33d01f43/templates/index.html。这 calgb_base.html 中的行是

<li><a class="side" href="% url password_change %">Password Change</a></li>

当我导航到顶部index 视图对应于 https://bitbucket.org/faheem/bixfile/src/71de33d01f43/urls.py#cl-16 和 https://bitbucket.org/faheem/bixfile/src/71de33d01f43/views.py#cl-203 我看到一个错误,以

开头
Caught NoReverseMatch while rendering: Reverse for 'password_change'
with arguments '()' and keyword arguments '' not found.

我怀疑完整的回溯是否有用,但我已将其粘贴在 http://paste.lisp.org/display/122996.

Apache 2.2 和 mod-wsgi 也可以重现此错误 作为内置的 Django 测试服务器(见下文)。

如果我直接访问 /password_change/ 相对 url,我会看到 密码更改表单符合预期。

奇怪的是,我编写的所有测试都是为了测试这个 通过,并产生预期的结果。参见例如 testIndexUrl , testIndexView 和 test_password_change_url.

您可以从 bixproj 目录运行测试

python manage.py test

如果您想尝试重现此错误,则相对容易。

首先下载项目(bixproj)和应用程序库 (bixfile)。所以

hg clone ssh://hg@bitbucket.org/faheem/bixproj
hg clone ssh://hg@bitbucket.org/faheem/bixfile

然后确保 bixfile 在 Python 路径中。更改要使用的数据库 sqlite。然后改变

LOGIN_URL = '/'+BIXFILE_NAME+'/login/'
LOGIN_REDIRECT_URL= '/'+BIXFILE_NAME+'/'

LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL= '/'

然后运行

python manage.py runserver

在本地计算机上的 bixproj 目录中并转到默认 url http://127.0.0.1:8000/ 应该会显示错误。

我希望我可以生成一个显示错误的最小示例,如果 有必要,但我真的希望这个错误很明显,我不 不得不。提前致谢。

【问题讨论】:

【参考方案1】:

您的bixfiles.urls 使用reverse。这是不可能的,因为在调用 reverse 时还没有加载 url。

Django 1.4 将有一个reverse_lazy 功能来解决这个问题。

与此同时,您可以:

    在您的项目中实现reverse_lazy(请参阅changeset 16121)。 硬编码网址而不是使用反向

【讨论】:

@Alasdair:我尝试了reverse_lazy 和硬编码'post_change_redirect' 参数,而不是使用reverse,正如你所建议的。不幸的是,这些都不起作用。我得到与以前完全相同的错误。注意我在urls.py 中以非常相似的方式使用reverse,就在有问题的条目上方,没有问题。您是否测试过这个提议的修复? 是的,我测试过了。当我用'/' 替换bixfiles.urls.py 中的所有 反向网址时,索引页对我有用。 为了澄清我之前的评论——我认为问题不在于索引页面的 url 模式中的 reverse,而是在您的 any 中使用 reverse网址模式。您是否尝试过从您的网址中完全删除反向?它对我有用。 @Alasdair:我替换了reverse everywhere with reverse_lazy, per the link you posted. To define reverse_lazy`我替换了from django.core.urlresolvers import reverse, from django.utils.functional import lazy, reverse_lazy = lazy(reverse, str)。它有效,所以看起来这确实是问题所在。非常感谢您在这方面的帮助。 很遗憾,错误消息如此无用,并且没有给出问题的线索。对此无能为力吗?此外,1.2 的文档没有暗示reverse 存在问题,并且可能导致难以跟踪的故障。如果 reverse_lazy 解决了问题,为什么不把它设为默认呢?

以上是关于带有密码更改视图的模板中的 Django url 错误的主要内容,如果未能解决你的问题,请参考以下文章

Django 渲染重定向到带有更改 url 的页面

使用带有特殊字符的 Django 的 url 模板标签

Django:如何从模板中识别调用视图?

带有查询参数的 Django url 模板

Django框架中的视图和模板

Django 模板视图 url 或 FileField