[英]Django form not saving password when creating user
我為我的django應用程序制作了一個自定義表單,允許用戶為網站注冊。
這是我的django應用程序的表單:
class TeacherRegistrationForm(UserCreationForm):
email = forms.EmailField(required = True)
school = forms.CharField(required = True)
subject = forms.CharField(required = True)
head_of_subject = forms.BooleanField(required = False)
identification_code = forms.CharField(required = True)
def __init__(self, *args, **kwargs):
super(TeacherRegistrationForm, self).__init__(*args, **kwargs)
self.fields['username'].help_text = ''
self.fields['password2'].help_text = ''
class Meta:
model = User
fields = (
'username',
'first_name',
'last_name',
'email',
'school',
'identification_code',
'subject',
'head_of_subject',
'password1',
'password2'
)
def save(self, request):
form = TeacherRegistrationForm(request.POST)
user = User.objects.create(first_name=self.cleaned_data['first_name'],
last_name=self.cleaned_data['last_name'],
email=self.cleaned_data['email'],
username=self.cleaned_data['username'],
password=self.cleaned_data['password1']
)
teacher_profile = TeacherProfile.objects.create(user=user,
school=self.cleaned_data['school'],
subject=self.cleaned_data['subject'],
head_of_subject=self.cleaned_data['head_of_subject'],
)
return user, teacher_profile
這是該觀點的相關部分:
if request.method == 'POST':
form = TeacherRegistrationForm(request.POST)
entered_school_name = form['school'].value()
entered_school_id = form['identification_code'].value()
actual_school_id = SchoolProfile.objects.get(school_name__exact = entered_school_name).identification_code
if form.is_valid()and (entered_school_id == actual_school_id):
user, teacher_profile = form.save(request)
return render(request, 'accounts/home.html')
else:
args = {'form': form}
return render(request, 'accounts/reg_form.html', args)
當我按提交時,會創建用戶,但是沒有為用戶設置密碼
沒有必要觸及屬於User的任何字段,事實上你不應該這樣做,而是讓UserCreationForm處理它,因為那里有一些特殊的密碼處理。
這樣做,在你的表單類保存方法:
def save(self):
user = super(TeacherRegistrationForm, self).save()
teacher_profile = TeacherProfile(
user=user,
school=self.cleaned_data['school'],
subject=self.cleaned_data['subject'],
head_of_subject=self.cleaned_data['head_of_subject']
)
teacher_profile.save()
return user, teacher_profile
這將導致TeacherRegistrationForm,它是UserCreationForm的子類,而UserCreationForm又是ModelForm的子類..將執行ModelForm應該做的事情,即當你調用它時保存到數據庫(用戶表)方法。 所以這一切都是為你完成的。 然后,您只需處理為其他模型添加到表單中的額外字段。
並注意我使用了模型save()
方法而不是使用create()
,在這種情況下完成相同的事情..但您可以稍后修改表單代碼以允許相同的表單編輯現有模型而不僅僅創建一個新的一個。 如果您希望我也解釋一下,請告訴我。
嘗試像這樣編輯表單,
def save(self):
user = User.objects.create_user(username=self.cleaned_data['username'], password=self.cleaned_data['password1'])
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
user.save()
teacher_profile = TeacherProfile.objects.create(user=user, school=self.cleaned_data['school'], subject=self.cleaned_data['subject'], head_of_subject=self.cleaned_data['head_of_subject'] )
return user, teacher_profile
使用User.objects.create_user()
而不是objects.create
。
我沒有看到將request
傳遞給save方法的重點。 您可以刪除該部分。 執行form.save()
時調用save
方法。 另外,在表單保存方法中再次保存表單實際上是不必要的。
無需以自定義方式保存用戶,您繼承了UserCreationForm
,它將在設置密碼后通過驗證返回用戶實例,因此您將在超級調用中獲得直接用戶實例。
def save(self, request):
user = super(TeacherRegistrationForm, self).save()
teacher_profile = TeacherProfile.objects.create(user=user,
school=self.cleaned_data['school'],
subject=self.cleaned_data['subject'],
head_of_subject=self.cleaned_data['head_of_subject'],
)
return user, teacher_profile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.