2013-10-29 20 views
2

我已經創建了一個自定義用戶註冊表單,從UserCreationForm。當我嘗試註冊時,它確實註冊成功,我可以看到一個新創建的用戶使用用戶名和電子郵件。但該用戶沒有密碼。django - 成功註冊後沒有設置密碼

在管理員中,該用戶的密碼字段是No password set.。請糾正我錯在哪裏。謝謝。

forms.py:

from album.forms import MyRegistrationForm 

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 

class MyRegistrationForm(UserCreationForm): 
    email = forms.EmailField(required=True) 

    class Meta: 
     model = User 
     fields = ('username', 'email', 'password1', 'password2',) 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.email = self.cleaned_data['email'] 

     if commit: 
      user.save() 

     return user 

views.py:

def register_user(request): 
    if request.method == "POST": 
     form = MyRegistrationForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/accounts/register_success/') 
    else: 
     form = MyRegistrationForm() 
    return render(request, 'register.html', {'form':form}) 

回答

3

當調用保存使用super超類,使用窗體MyRegistrationForm,而不是它的超UserCreationForm

user = super(MyRegistrationForm, self).save(commit=False) 
+0

這樣做的工作,謝謝!請你們友善地告訴我它是如何工作的? – Aamu

+2

解釋'超級'是棘手的,所以我建議你在其他地方閱讀它,但我會盡量簡單地解釋一下。當你調用'super(UserCreationForm,self).save(commit = False)'時,它會調用'UserCreationForm'的超類的保存方法,即'ModelForm'。當你調用'super(MyRegistrationForm,self).save(commit = False)'時,它會調用'MyRegistrationForm'的超類UserCreationForm的save方法。你需要第二個,因爲它是設置密碼的'UserCreationForm.save()'。 – Alasdair

+0

現在解釋了很多。感謝您簡要但明確的解釋。 – Aamu