Возникли проблемы с созданием специального пользователя в Django - PullRequest
0 голосов
/ 26 мая 2020

Я новичок в 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 |

Как видите, пароль не шифруется, а электронная почта отличается. Мне интересно, почему это происходит? Я следую руководству, и вот мой код:

models.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

ursl.py

from .views import UserViewSet
router.register('api/registerUser', UserViewSet, 'registerUsers')

seralizer.py

# qssgg Seralizer
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

И мой запрос: http://localhost:8000/api/registerUsers/

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 26 мая 2020

Кажется, есть две отдельные проблемы.

Во-первых, в вашем вызове self.normalize_email отсутствуют круглые скобки, поэтому функция не выполняется. Измените его на следующее:

email = self.normalize_email

Во-вторых, Django REST Framework не вызывает вашу функцию create_user, которая правильно использует set_password() для установки пароля пользователя. Добавьте следующий метод your serializers.py:

def create(self, validated_data):
    return User.objects.create_user(validated_data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...