簡體   English   中英

Django在創建用戶時不保存密碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM