0

我正在使用Django 1.2.3-3+squeeze1與Debian squeeze。帶有password_change視圖的模板中的Django url錯誤

我正在嘗試在我的應用程序 中使用對應於django.contrib.auth.views.password_change的Django密碼更改視圖。這 看起來應該是直截了當,但我一直有 問題。

爲了簡單和完整,我將指向我的應用程序文件 在線。該應用程序是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"), 

這打破了其使用的任何模板。目前,我只是 使用它的在線模板calgb_base.html,其中包括在一堆 模板,包括頂級索引視圖的 https://bitbucket.org/faheem/bixfile/src/71de33d01f43/templates/calgb_base.html#cl-21 ,對應 模板 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> 

當我導航到對應於 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. 

開始我懷疑完整頂部index視圖回溯是有用的,但我已將其粘貼在 http://paste.lisp.org/display/122996

這個錯誤對於Apache 2.2和mod-wsgi以及 作爲內置Django測試服務器(見下文)都是可重現的。

如果我直接進入/ password_change /相對url,我會看到 密碼更改窗體如預期。

奇怪的是我寫的所有測試都通過測試這個 ,併產生了預期的結果。參見例如 testIndexUrl , testIndexViewtest_password_change_url

您可以

python manage.py test 

如果你想嘗試重現此錯誤是比較容易的運行從bixproj目錄下的測試。

首先下載該項目(bixproj)和應用程序庫 (bixfile)。所以

hg clone ssh://[email protected]/faheem/bixproj 
hg clone ssh://[email protected]/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目錄

,並打算爲默認網址 http://127.0.0.1:8000/應該顯示錯誤。

我希望我可以產生一個極小的例子,如果 必要,但我真的希望這個錯誤是明顯的,我不 必須。提前致謝。

回答

1

您的bixfiles.urls使用reverse。這是不可能的,因爲當reverse被調用時,url還沒有被加載。

Django 1.4將有一個reverse_lazy功能,可以解決這個問題。

在此期間,您可以:

  1. 實施項目reverse_lazy(見changeset 16121)。
  2. 硬編碼的網址,而不是使用反向
+0

@Alasdair:我都嘗試'reverse_lazy'和硬編碼「post_change_redirect」的說法,而不是使用'reverse',如你所說。不幸的是,這些作品都沒有。我得到和以前完全一樣的錯誤。注意我在'urls.py'中以非常相似的方式在有問題的條目上方使用'reverse',沒有任何問題。你測試了這個建議的修復嗎? –

+0

是的,我測試過了。當我用''/''替換'bixfiles.urls.py'中的所有**反轉url時,索引頁爲我工作。 – Alasdair

+0

爲了澄清我以前的評論 - 我相信問題不是索引頁的url patter中的「reverse」,它是在任何** url模式中使用「reverse」。你有沒有嘗試徹底刪除你的網址反向?它爲我工作。 – Alasdair