首页 > 解决方案 > 在 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/

任何帮助,将不胜感激。谢谢!

标签: pythondjango

解决方案


似乎有两个不同的问题。

首先,您的调用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)

推荐阅读