django - 自定义用户在数据库中没有密码
问题描述
当我尝试使用我的自定义用户模型登录时,我收到了“请输入正确的电子邮件和密码。两个地方都要注意大小写。'。当我检查数据库时,我看到超级用户有密码,但我的测试用户没有。
我尝试过的事情:
- 检查用户的数据库(他们存在但没有密码)
- 删除数据库并运行 makemigrations
- 超级用户可以登录管理员和常规登录表单就好了
帐户/模型.py
from django.db import models
from django.contrib.auth.models import (
AbstractBaseUser,
BaseUserManager,
PermissionsMixin,
)
# Create your models here.
class UserManager(BaseUserManager):
def create_user(self, email, first_name, last_name, company, phone, is_active=True, is_admin=False, is_staff=False, is_dealer=False, password=None):
if not email:
raise ValueError("Users must have an email address")
if not password:
raise ValueError("Users must have a password")
if not first_name:
raise ValueError("Users must have a first name")
if not last_name:
raise ValueError("Users must have a last name")
if not company:
raise ValueError("Users must have a company")
if not phone:
raise ValueError("Users must have a phone number")
user_obj = self.model(
email = self.normalize_email(email)
)
user_obj.set_password(password)
user_obj.first_name = first_name
user_obj.last_name = last_name
user_obj.company = company
user_obj.phone = phone
user_obj.admin = is_admin
user_obj.staff = is_staff
user_obj.dealer = is_dealer
user_obj.active = is_active
user_obj.save(using=self._db)
return user_obj
def create_superuser(self, email, first_name, last_name, company, phone, password=None):
user = self.create_user(
email,
first_name,
last_name,
company,
phone,
password=password,
is_admin=True,
is_staff=True
)
return user
def create_company_staff_user(self, email, first_name, last_name, company, phone, password=None):
user = self.create_user(
email,
first_name,
last_name,
company,
phone,
password=password,
is_staff=True
)
return user
def create_dealer_user(self, email, first_name, last_name, company, phone, password=None):
user = self.create_user(
email,
first_name,
last_name,
company,
phone,
password=password,
is_dealer=True
)
return user
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=255, unique=True)
first_name = models.CharField(max_length=255, blank=True, null=True)
last_name = models.CharField(max_length=255, blank=True, null=True)
company = models.CharField(max_length=255, blank=True, null=True)
phone = models.CharField(max_length=255, blank=True, null=True)
active = models.BooleanField(default=True) # can login
online = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
staff = models.BooleanField(default=False)
dealer = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
# USERNAME_FIELD and password are required by default
REQUIRED_FIELDS = ['first_name', 'last_name', 'company', 'phone']
objects = UserManager()
def __str__(self):
return f"{self.first_name} {self.last_name}"
def get_full_name(self):
return f"{self.first_name} {self.last_name}"
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
@property
def is_admin(self):
return self.admin
@property
def is_staff(self):
return self.staff
@property
def is_dealer(self):
return self.dealer
@property
def is_active(self):
return self.active
@property
def is_online(self):
return self.online
帐户/admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model
# Register your models here.
User = get_user_model()
admin.site.register(User)
设置.py
AUTH_USER_MODEL = 'accounts.User'
主/模板/注册/login.html
<div class="container">
<div class="card my-4">
{% load static %}
<img class="img-fluid pb-4" src="{% static 'img/logos/logo-black.png' %}">
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
{% if next %}
{% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed,
please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %}
{% endif %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-success"><i class="fas fa-sign-in-alt"></i> Login</button>
<input type="hidden" name="next" value="{{ next }}" />
</form>
</div>
</div>
我的项目/urls.py
urlpatterns = [
path("", include('main.urls')),
path('accounts/', include('django.contrib.auth.urls')),
path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我不知道还能尝试什么。我所需要的只是能够使用电子邮件而不是用户名登录并拥有两种类型的用户。(员工和经销商)
编辑:我刚刚检查了我的数据库,看来我的测试用户没有密码。
解决方案
UserAdmin
您应该使用auth 包中的注册您的用户模型。它应该只插入您的模型,并为您提供正确创建用户的自定义表单
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
User = get_user_model()
admin.site.register(User, UserAdmin)
推荐阅读
- image - 如何使用 AWS S3 和 Vapor 3 和 Leaf 显示图像
- javascript - 用户可以看到文章结尾时的Jquery阅读位置进度
- python - django large FileField 初始化和内存
- python - 如何按绝对值对数组编号进行排序
- python - 如何获取文本的 CSS 选择器
- sqlite - 在子查询的 group by 中使用外部查询的字段
- bash - Bash:增加 Java 属性文件中的版本号(代号一版本)
- mongodb - 如何对数组内的 JSONS 进行正则表达式查询
- python - 如何在 Tkinter 中返回当前关注的条目的长度?(以退格键为重点的条目)
- python - 为什么 elasticsearch python parallel_bulk 使用这么多内存?