Django:我可以使用 CreateView 创建一个用户对象,其中用户只是 Django 的内置用户模型吗?

Django : Can I use CreateView to create a User object where User is just Django's built in User model?

我正在尝试创建一个简单的用户登录系统,用户可以在一个页面上注册,然后使用这些凭据在另一个页面上登录网站。这是我的注册和登录视图:

class SignupView(CreateView):
    model = User
    form_class = SignupForm
    template_name = 'journal_app/signup.html'
    success_url = reverse_lazy('home')

class LoginUserView(LoginView):
    template_name = 'journal_app/login.html'

如您所见,我正在使用 CreateView 创建用户对象。用户注册后,我可以在管理控制台的用户组中看到记录已成功更新。问题是当我尝试登录时,它总是抛出 username/password 不匹配错误。任何想法可能是什么原因?我是 Django 的初学者,所以它可能非常简单。

注册表单-

class SignupForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'username', 'password']
        widgets = {
            'password': forms.PasswordInput()
        }

问题是您需要 散列 密码。姜戈 stores a hash of the password [Django-doc]. If you make a custom user model, you should normally implement a UserManager [Django-doc] as well. This takes a password, and will hash it, for examply by calling a method .set_password(…) [Django-doc]。然后,此方法将 散列 密码。

因此您可以重写表单以保存用户:

class SignupForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'username', 'password']
        widgets = {
            'password': forms.PasswordInput()
        }

    def save(self, commit=True):
        user = super().save(commit=False)
        user.<b>set_password(</b>self.cleaned_data['password']<b>)</b>
        if commit:
            user.save()
        return user