django - 如何通过 django-rest-api 用户创建允许空白密码
问题描述
就我而言,我需要一个用户组,在创建用户时不会设置电子邮件和密码。他们也不需要对自己进行身份验证。
我设法使用可为空的电子邮件来自定义用户,但我找不到在 API 调用或 Django 管理表单中允许空白密码的方法。我不太关心表单,但我需要让它通过 API 工作。
我怎么能允许使用空白密码创建一个新的自定义用户,并且如果它是空白的(如 set_unusable_password()),可能会将其设置为有意义的东西?
谢谢!
我的CustomUserManager
:
from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _
class CustomUserManager(BaseUserManager):
def create_user(self, email, password, **extra_fields):
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
# if password == "":
# user.set_password(None)
# else:
user.set_password(password)
user.save()
return user
def create_superuser(...
解决方案
您可以基于您的 CustomUserAbstractUser
并使用set_password
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
...
多亏了这一点,您可以访问该功能set_password
。任何基于 CustomUser 的用户都将继承:
def set_password(self, raw_password):
self.password = make_password(raw_password)
self._password = raw_password
如果你仔细观察make_password
,你会意识到可以给它None
:
if password is None:
return UNUSABLE_PASSWORD_PREFIX + get_random_string(UNUSABLE_PASSWORD_SUFFIX_LENGTH)
您可以查看 Django 上的完整示例,以获得一个起点Manager
您的模型将如下所示:
class MyUser(AbstractBaseUser):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
date_of_birth = models.DateField()
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = MyUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['date_of_birth']
上传经理后更新:
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(...
您忘记了password=None
您的 create_user。这就是您需要此错误的原因。
推荐阅读
- java - 如何将位图保存到android中的应用程序文件夹
- javascript - 如何将数据从父 vuejs 传递给子组件
- r - 使用多个列和值进行更长的旋转
- date - 从 String 中获取日期并在 Flutter Dart 中转换为 Date 对象
- java - Spring Webflux Reactor WebClient onErrorDropped
- selenium - 带有机器人框架的 Pycharm - Intellisense 不工作
- vue.js - VueJS-“npm run build”不创建 index.html
- algorithm - 查找从数组中一一删除最大数字的总成本
- reactjs - 如何禁用 Ant Design React Form 中的字段?
- r - 如何在 R Shiny App 中保留复选框中的值?