python - 在 Django 中创建自定义用户时遇到问题
问题描述
我是 Django 新手,我正在尝试创建一个自定义用户。但是,我注意到我的数据只是从我的 POST 请求中将原始数据插入到数据库中。例如,如果我使用 create superuser 从终端插入数据,我的数据库中的数据看起来像这样
id | password | last_login | email | staff | adm
1 | pbkdf2_sha256$180000$bGUp7u590CDf$wlecM+W0h7/6q/rZhKP73IMH13msn87I/RoK/VJewKk= | NULL | <bound method BaseUserManager.normalize_email of <class 'qssgg.models.UserManager'>> | 1 | 1 |
但是,如果我尝试存储来自我的 REST API POST 请求的数据,它会存储这样的数据
| id | password | last_login | email | staff | admin |
+----+----------+------------+-----------------------+-------+-------+
| 1 | hi | NULL | bobby000000@gmail.com | 0 | 0 |
如您所见,密码没有加密,电子邮件也不同。我想知道为什么会这样?我正在学习教程,这是我的代码:
模型.py
class UserManager(BaseUserManager):
def create_user(self, email, password = None, isStaff=False, isAdmin=False):
if not email:
raise ValueError("User must have an email")
if not password:
raise ValueError("User must add password")
userObj = self.model(
email = self.normalize_email
)
userObj.set_password(password)
userObj.staff = isStaff
userObj.admin = isAdmin
userObj.save(using=self._db)
return userObj
def create_staffuser(self, email, password = None):
user = self.create_user(
email,
password = password,
isStaff = True
)
return user
def create_superuser(self, email, password = None):
user = self.create_user(
email,
password = password,
isStaff = True,
isAdmin= True,
)
return user
class User(AbstractBaseUser):
email = models.EmailField(max_length = 255, unique = True)
staff = models.BooleanField(default = False)
admin = models.BooleanField(default = False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def __str__(self):
return self.email
@property
def isStaff(self):
return self.staff
@property
def isAdmin(self):
return self.admin
url.py
from .views import UserViewSet
router.register('api/registerUser', UserViewSet, 'registerUsers')
序列化器.py
# qssgg Seralizer
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
我的要求是http://localhost:8000/api/registerUsers/
任何帮助,将不胜感激。谢谢!
解决方案
似乎有两个不同的问题。
首先,您的调用self.normalize_email
缺少括号,因此该函数不会被执行。将其更改为以下内容:
email = self.normalize_email
其次,Django REST Framework 没有调用您create_user
正确用于set_password()
设置用户密码的函数。添加以下方法serializers.py
:
def create(self, validated_data):
return User.objects.create_user(validated_data)
推荐阅读
- c# - 使用 Selenium 和 C# 在 draggable=true 时拖放不工作
- java - 我这样做是为了让玩家面向鼠标方向,但因此出现了问题
- html - 如何避免下载文件重命名?
- java - 如何在 Spring Boot 的 @Query 注释中传递变量而不是表名?
- swift - 来自 url 的日期格式 (JSON)
- javascript - 如何使用 javascript 设置 ondragstart 属性
- c++ - 如何在 C++ 中为多个类类型指定相同的模板化成员函数?
- c# - SQLite VACUUM 命令更改 rowid 值
- angular - 我如何从一个返回对象数组的 Observable 创建一个对象
- c++ - C++二维指针数组初始化C2440