我在Django上写网站,我需要做一个工作peepers的注册和授权系统,为此我使用Django AbstractUser模型,注册工作良好,但授权不起作用,并且authenticate方法返回None
下面是我的JobseekerRegsiterInfo模型:
class JobseekerRegisterInfo(AbstractUser):
username = first_name = last_name = None
id = models.BigAutoField(primary_key=True)
phone_number = PhoneNumberField()
email = models.EmailField(unique=True)
full_name = models.CharField(max_length=120)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['phone_number', 'full_name', 'hashed_password']
def __str__(self):
return self.full_name
登录表单:
class JobseekerLoginForm(forms.Form):
email = forms.EmailField(label='Введіть ваш Email: ',
widget=forms.EmailInput(attrs={'class': 'form-control'}))
password = forms.CharField(label='Ваш пароль: ',
widget=forms.PasswordInput(attrs={'class': 'form-control'}))
def clean_email(self):
email = self.cleaned_data['email']
# if not select_field_value_from_model(JobseekerRegisterInfo, 'email', email):
if not JobseekerRegisterInfo.objects.filter(email=email):
raise forms.ValidationError('Неправильно введені email або пароль')
return email
查看功能:
def jobseeker_login_view(request):
title = 'Авторизація'
context = {'title': title}
if request.method == 'POST':
form = JobseekerLoginForm(request.POST)
context['form'] = form
if form.is_valid():
email = form.cleaned_data['email']
password = form.cleaned_data['password']
user = authenticate(request, email=email, password=password)
print(generate_password_hash(password))
if user:
print(user)
else:
print('USER IS NONE')
else:
form_errors = form.errors.as_data()
custom_error = custom_error_service(form_errors)
context['list_first_error'] = custom_error
else:
form = JobseekerLoginForm()
context['form'] = form
return render(request, template_name='jobseeker/jobseeker_login.html', context=context)
但无论我做什么,控制台中都只显示USER IS NONE
请告诉我,在我的情况下如何正确使用authenticate
1条答案
按热度按时间kninwzqo1#
AbstractUser
和AbstractBaseUser
的基本区别AbstractUser
AbstractUser类继承User类,用于在数据库本身中添加用户所需的其他字段。所以它改变了数据库的模式。它主要用于添加诸如date_of_birth、location和bio等字段。到现有的用户模型这是做的最开始的项目。这意味着您将获得完整的字段,默认情况下,该字段与用户Model以及您添加/定义的以下字段一起提供。
AbstractBaseUser
AbstractBaseUser只具有身份验证功能,它没有实际的字段,您将在子类化时提供要使用的字段。
你必须知道哪些字段代表用户名字段,以及如何管理这些用户
例如,你必须在身份验证中使用电子邮件,通常Django在身份验证中使用用户名,那么你如何将其更改为使用电子邮件?
注意-所以,你需要继承
AbstractBaseUser
而不是AbstractUser
来使用Django内置的身份验证功能。