пароль не хешируется в пользовательской модели, использующей остальные API - PullRequest
0 голосов
/ 05 февраля 2020

Я пытался создать пользовательскую модель пользователя и создать rest-api, но когда я отправляю пост-запрос, он создает модель пользователя, но пароль не хэшируется. Я использую установленный пароль в своем методе user_create, и он отлично работает для суперпользователь на основе командной строки, но когда я использую другого пользователя, созданного API, это не так, я использую метод установки пароля, но он также не работает Вот моя пользовательская модель

class UserProfile(AbstractBaseUser, PermissionsMixin):
    """custom user model"""
    email = models.EmailField(max_length=250, unique=True)
    name = models.CharField(max_length=250)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    # django required and django user field declaration
    USERNAME_FIELD = 'email'
    objects = UserProfileManager()
    REQUIRED_FIELDS = ['name']

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

мой менеджер профилей

class UserProfileManager(BaseUserManager):
    """User manager for our custom user model"""

    def create_user(self, name, email, password=None):
        if not email:
            raise ValueError('User Must have an email')
        email = self.normalize_email(email)
        user = self.model(name=name, email=email)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, name, email, password=None):
        user = self.create_user(
            name=name,
            email=email,
            password=password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)

мой сериализатор

class UserProfileSerializer(serializers.ModelSerializer):
    """Serializes our custom django user model UwU (nice serializer desu ka)"""


    class Meta:
        model = models.UserProfile
        fields = ('id','name','email','password')
        extra_kwargs = {
            'password':{
                'write_only':True,
                'style':{
                    'input_type':'password'
                }
                }
            }
        def create(self, validated_data):
                """ Create and return a new user"""
                user = models.UserProfile.objects.create_user(
                    email=validated_data['email'],
                    name=validated_data['name']
                )
                user.set_password(validated_data['password'])
                user.save()
                return user

мой просмотр

class ProfileViewSet(ModelViewSet):
    """View set for user profile"""
    serializer_class = serializer.UserProfileSerializer
    queryset = models.UserProfile.objects.all()
    authentication_classes = (TokenAuthentication,)

Я новичок в django, поэтому, пожалуйста, помогите мне

1 Ответ

0 голосов
/ 05 февраля 2020

Вам не нужно явно указывать set_password в seiralizer, поскольку у вас уже есть create_user manager method. Поэтому попробуйте так:

class UserProfileSerializer(serializers.ModelSerializer):

   class Meta:
        model = models.UserProfile
        fields = ('id','name','email','password')
        extra_kwargs = {
            'password':{
                'write_only':True,
                'style':{
                    'input_type':'password'
                }
             }
         }

    def create(self, validated_data):
        user = models.UserProfile.objects.create_user(
                    email=validated_data['email'],
                    name=validated_data['name'],
                    password = validated_data['password']
               )
        return user
...