使用password_change视图的模板中的Django url错误

时间:2011-06-28 20:19:58

标签: django django-templates django-urls django-generic-views

我正在使用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-16https://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 / relative url,我会看到 密码更改表格符合预期。

奇怪的是,我编写的所有测试都是为了测试它 通过,并产生预期的结果。例如,参见 testIndexUrltestIndexViewtest_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/应显示错误。

我希望我可以生成一个显示错误的最小示例if 必要的,但我真的希望这个错误是显而易见的,我没有 不得不。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的bixfiles.urls使用reverse。这是不可能的,因为在调用reverse时尚未加载URL。

Django 1.4将具有reverse_lazy功能,可解决此问题。

与此同时,您可以:

  1. 在您的项目中实施reverse_lazy(请参阅changeset 16121)。
  2. 对网址进行硬编码,而不是使用反向