2013-07-03 25 views
0

我明白,當我們需要製作django內置視圖時,參數說明應該在內置視圖函數可以使用之前進行。爲什麼django內置auth視圖不能識別自定義表單?

現在我想自定義Django的權威性視圖password_reset_confirm

,並在URL的形式,我輸入我的自定義表單

from Myapp.forms import PasswordSetForm 
from django.contrib.auth import urls,views 

和網址

url(r'^accounts/ ^reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$ ', 
     'django.contrib.auth.views.password_reset_confirm',{'set_password_form':PasswordSetForm}, 
     name='password_reset_confirm'), 
url(r'^accounts/', include('django.contrib.auth.urls')), 

我form.py我導入原始SetPasswordForm作爲默認形式使用django password_reset_confirm功能

from django.contrib.auth.forms import SetPasswordForm 

,然後自定義表單

class PasswordSetForm(SetPasswordForm): 
    error_messages = { 
     'invalid_password': _("Please enter a valid password as instructed"), 
     'password_mismatch': _("The two password fields didn't match."), 
    } 


    #new_password1 = forms.CharField(label=_("New password"), 
    #        widget=forms.PasswordInput) 
    #new_password2 = forms.CharField(label=_("New password confirmation"), 
    #        widget=forms.PasswordInput) 


    new_password1 = forms.CharField(widget=forms.PasswordInput, min_length=6, label='New Password') 
    new_password2 = forms.CharField(widget=forms.PasswordInput, min_length=6, label='Confirm new password') 

    def clean_new_password1(self): 
     new_password1 = self.cleaned_data.get("new_password1") 

     # password must contain both Digits and Alphabets 
     # password cannot contain other symbols 
     if new_password1.isdigit() or new_password1.isalpha() or not new_password1.isalnum(): 
      raise forms.ValidationError(
       self.error_messages['invalid_password'], 
       code='invalid_password', 
      ) 
     return new_password1 

,你可以看到更多的檢查是對new_password1

但嘗試多次的頁面後進行仍在使用默認的SetpasswordForm作爲默認標籤爲兩個密碼顯示在我的HTML而不是我的自定義標籤(在HTML {{form.new_password2.label}}用於顯示標籤),並沒有額外的檢查new_password1完成

我試圖創建另一個不繼承SetPassordForm的MyPasswordSetForm,並將其傳遞給password_reset_confirm,但它沒有任何區別,仍使用默認形式。

我已經搜索了很多,並就此提出問題,似乎這是正確的方法,但是這裏可能是什麼問題?

非常感謝您的幫助。

+0

它實際上似乎是正確的,你怎麼知道它仍然使用'SetPasswordForm'?在你的問題中不清楚。 –

+0

在我的HTML我使用form.new_passord2.label,所以從標籤輸出,我可以看到使用默認窗體(正如你可以看到我的標籤new_password2是不同於默認窗體),也沒有錯誤檢查在new_password1上完成(例如,最小長度爲6,應該包含數字和alpha)。但它會做比較兩個默認形式的密碼的錯誤檢查 – Mona

+1

您是否已經仔細檢查實際視圖是否被調用?另外,也許你已經完成了,但重新嘗試重新啓動服務器。你的代碼看起來很好。 –

回答

2

哎呀,那個URL的正則表達式看起來錯錯錯:

r'^accounts/ ^reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$ ' 

它應該是:

r'^accounts/reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$' 
+0

美妙的!!!!它的工作和預期一樣!謝謝sooo jpic! – Mona

+0

抱歉,最初我使用了帳戶/重置/ ...但是沒有工作,所以我複製了顯示所有auth.urls的PageNotFound(404)帳戶的網址/^reset/...。另外,我認爲我最初的帳戶/重置/ ...不起作用的原因是因爲/ $'之前的空白,我沒有注意到。太棒了,非常感謝你.. – Mona

相關問題