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



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

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来创建用户对象。用户注册后,我可以在管理控制台的"用户"组中看到记录已成功更新。问题是,当我尝试登录时,它总是给我一个用户名/密码不匹配的错误。有什么想法吗?原因是什么?我是Django的初学者,所以它可能非常简单。

注册表格-

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

问题是您需要散列密码。Django存储密码[Django-doc]哈希。如果您创建了一个自定义用户模型,通常也应该实现UserManager[Django-doc]。这需要一个密码,并将其散列,例如通过调用方法.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.set_password(self.cleaned_data['password'])
if commit:
user.save()
return user

最新更新