创建用户时Django表单未保存密码

wtr*_*ton 5 python django django-forms

我已经为我的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
Run Code Online (Sandbox Code Playgroud)

这是视图的相关部分:

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)
Run Code Online (Sandbox Code Playgroud)

当我按提交时,将创建用户,但是没有为用户设置密码

lit*_*die 3

无需触及 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
Run Code Online (Sandbox Code Playgroud)

这将导致 TeacherRegistrationForm,它是 UserCreationForm 的子类,而 UserCreationForm 又是 ModelForm 的子类.. 将执行 ModelForm 应该执行的操作,即在调用其 save 时将其自身保存到数据库(用户表)方法。这一切都为你完成了。然后,您只需处理添加到其他模型表单中的额外字段。

请注意,我使用了 modelsave()方法而不是 using create(),在这种情况下完成了相同的事情..但您稍后可以修改表单代码以允许相同的表单编辑现有模型,而不仅仅是创建一个新模型。如果您也希望我对此进行解释,请告诉我。