创建自定义用户模型并在管理面板中注册新用户后!!!无法从网站登录,错误 -请输入正确的邮件和密码。两个地方都要注意大小写。
Python 3.7,Django 2.2,站点上不允许用户注册,只能从管理面板并且只能由管理员进行。
MOELS.PY
class UserManager(BaseUserManager):
def create_user(self, email, first_name=None, password=None, is_active=True,
is_staff=False, is_admin=False):
if not email:
raise ValueError('Поле email должно быть заполнено')
if not password:
raise ValueError('Неверный пароль')
user = self.model(
email=self.normalize_email(email),
first_name=first_name
)
user.set_password(password)
user.staff = is_staff
user.admin = is_admin
user.active = is_active
user.save(using=self._db)
return user
def create_staffuser(self, email, first_name=None, password=None):
user = self.create_user(
email,
first_name=first_name,
password=password,
is_staff=True
)
return user
def create_superuser(self, email, first_name=None, password=None):
user = self.create_user(
email,
first_name=first_name,
password=password,
is_staff=True,
is_admin=True
)
return user
class RealUser(AbstractBaseUser):
first_name = models.CharField('Имя', max_length=120)
last_name = models.CharField('Фамилия', max_length=120, db_index=True)
patronymic = models.CharField('Отчество', max_length=120)
phone_number = models.CharField('Телефон', max_length=15, unique=True)
email = models.EmailField('Почта', max_length=30, unique=True)
image = models.ImageField('Фото', default='user.png', upload_to='user_img')
description = models.TextField('О себе', default='')
department = models.ForeignKey(UserDepartment, on_delete=models.SET_NULL, null=True, verbose_name='Отдел')
position = models.ForeignKey(UserPosition, on_delete=models.SET_NULL, null=True, verbose_name='Должность')
status = models.ForeignKey(UserStatus, on_delete=models.SET_NULL, null=True, verbose_name='Статус')
active = models.BooleanField('Работает', default=True)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name']
objects = UserManager()
def __str__(self):
return f'СОТРУДНИК: {self.first_name} {self.last_name}, ПОЧТА: {self.email}, ТЕЛЕФОН: {self.phone_number}'
# return self.email
def get_full_name(self):
return f'{self.first_name} {self.last_name}, ПОЧТА: {self.email}'
# return self.email
def get_short_name(self):
return f'{self.last_name}, ПОЧТА: {self.email}'
# return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_staff(self):
return self.staff
@property
def is_admin(self):
return self.admin
@property
def is_active(self):
return self.active
def get_absolute_url(self):
return reverse('employee_detail', args=[str(self.email)])
class Meta:
verbose_name = 'Сотрудник'
verbose_name_plural = 'Сотрудники'
管理员
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.contrib import admin
from django import forms
from .models import *
User = get_user_model()
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput)
password2 = forms.CharField(label='Подтверждение паорля', widget=forms.PasswordInput)
class Meta:
model = RealUser
fields = ('email', 'first_name',)
def clean_password2(self):
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise forms.ValidationError('Пароли не совпадают')
return password2
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data['password1'])
if commit:
user.save()
return user
class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField()
class Meta:
model = RealUser
fields = (
'email',
'password',
'first_name',
'trainee',
'manager',
'head',
'staff',
'admin',
)
def clean_password(self):
return self.initial['password']
class UserAdmin(admin.ModelAdmin):
search_fields = [
'email',
'last_name',
]
list_filter = [
'active',
'head',
'manager',
'trainee',
'staff',
]
list_display = [
'first_name',
'last_name',
'email',
'phone_number',
'active',
'head',
'manager',
'trainee',
'staff',
'admin',
]
class Meta:
model = User
admin.site.register(UserDepartment)
admin.site.register(UserPosition)
admin.site.register(UserStatus)
admin.site.register(RealUser, UserAdmin)
admin.site.register(GuestUser)
admin.site.register(GuestUserStatus)
admin.site.unregister(Group)
登录.HTML
{% extends 'core/index.html' %}
{% block title %}
Вход в личный кабинет
{% endblock %}
{% block content %}
<h1>{{ user.first_name }}</h1>
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">
Log in
</legend>
{{ form.as_p }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">
Login
</button>
</div>
</form>
</div>
{% endblock %}
设置.py
***
AUTH_USER_MODEL = 'users.RealUser'
***
我注意到了这一刻(有些东西告诉我这就是问题所在)。如果您进入管理配置文件中的管理面板,则密码将以散列形式显示,并且以文本形式为用户显示:
ADMIN.PY(已更正)
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput)
password2 = forms.CharField(label='Подтверждение паорля', widget=forms.PasswordInput)
class Meta:
model = RealUser
fields = ('email', 'first_name',)
def clean_password2(self):
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise forms.ValidationError('Пароли не совпадают')
return password2
def save(self, *args, **kwargs):
user = super().save(*args, **kwargs)
user.set_password(self.cleaned_data['password1'])
user.save()
return user
您的问题是您仅在 commit==True 时保存用户
更新到
模型管理员