Mr.*_*oid 1 python django django-models django-admin django-authentication
我正在尝试在我的 django 应用程序中创建自定义用户模型。但是每当我尝试这样做时,我都无法使用管理面板中的“超级用户”创建的“工作人员用户”登录。它说:
“请输入员工帐户的正确用户名和密码。请注意,这两个字段都可能区分大小写。”
应用名称:后台
后端/models.py
from django.db import models
from django.contrib.auth.models import (
AbstractBaseUser,
BaseUserManager
)
# Create your models here.
class UserManager(BaseUserManager):
def create_user(
self,
username = None,
email = None,
password = None,
is_active = True,
is_staff = False,
is_admin = False
):
if not username:
raise ValueError("Users must have a username")
if not password:
raise ValueError("Users must have a password")
if not email:
raise ValueError("Users must have a email")
user_obj = self.model(
username = username
)
user_obj.email = self.normalize_email(email)
user_obj.set_password(password)
user_obj.is_active = is_active
user_obj.is_staff = is_staff
user_obj.is_admin = is_admin
user_obj.save(using=self._db)
return user_obj
def create_staffuser(self, username, email, password):
user_obj = self.create_user(
username = username,
email = email,
password = password,
is_staff = True
)
return user_obj
def create_superuser(self, username, email, password):
user_obj = self.create_user(
username = username,
email = email,
password = password,
is_staff = True,
is_admin = True
)
return user_obj
class User(AbstractBaseUser):
username = models.CharField(max_length=255, unique=True)
email = models.EmailField(max_length=255, unique=True)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = "username"
REQUIRED_FIELDS = ["email"]
def __str__(self):
return self.username
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
def has_module_perms(self, app_label):
return True
def has_perm(self, perm, ob=None):
return True
Run Code Online (Sandbox Code Playgroud)
后端/admin.py
from django.contrib import admin
from Backend.models import(
User
)
# Register your models here.
admin.site.register(User)
Run Code Online (Sandbox Code Playgroud)
我将这些行添加到settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# my application
'Backend'
]
# added lines
AUTH_USER_MODEL = "Backend.User"
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
Run Code Online (Sandbox Code Playgroud)
提前致谢。
我遇到了类似的问题,发现通过管理界面创建新用户时密码没有被散列。使用自定义用户模型时,您需要注册正确的用户模型,ModelAdmin即django.contrib.auth.admin.UserAdmin:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from Backend.models import(
User
)
admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)
ModelAdmin 对象实现 Django 管理站点的逻辑,而身份验证逻辑由应用程序UserAdmin的类实现auth。admin.site.register(User)将创建一个默认值ModelAdmin,User仅在其上实现简单的 CRUD 操作。这就是在我的例子中存储的密码没有被散列的原因,这使得它在稍后尝试登录时总是返回错误的密码错误(因为 Django 假设存储的密码是散列的)。
此外,管理器不用于在管理站点中创建新对象。您必须重写 ModelAdmin 类才能对其进行自定义。
| 归档时间: |
|
| 查看次数: |
2066 次 |
| 最近记录: |