Вопрос

Я следую в

Это было полезно?

Решение 4

Обратите внимание, что Set_Password () не сохраняет объект, и, поскольку вы только что назвали Super, ваш объект уже сохранен с помощью RAW Password.

Просто используйте post_save (), чтобы сохранить пароль.

def post_save(self, obj, created=False):
    """
    On creation, replace the raw password with a hashed version.
    """
    if created:
        obj.set_password(obj.password)
        obj.save()
.

Другие советы

Я попробовал принятый ответ в DRF 3.0.2, и он не работал.Пароль не был хешин.

вместо этого, переопределить метод создания в вашей модели сериализатора

    def create(self, validated_data):
        user = User(email=validated_data['email'], username=validated_data['username'])
        user.set_password(validated_data['password'])
        user.save()
        return user
.

Это хэши пароль, когда вы создаете пользователя, используя среду отдыха, а не post_save

Другой подход для DRF 3.x:

from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import make_password

    def create(self, validated_data):    
        if validated_data.get('password'):
            validated_data['password'] = make_password(
                validated_data['password']
            )

        user = get_user_model().objects.create(**validated_data)

        return user
.

Я использовал Решение Wsgeorge для создания собственного.Пустой объект User создается только так, чтобы я мог использовать .set_password():

def create(self, validated_data):
    user = User()
    user.set_password(validated_data['password'])
    validated_data['password'] = user.password
    return super(UserSerializer, self).create(validated_data)
.

отличается от его ответа, я сам не спасаю пользователя.Я оставляю это для родительского класса, вызывающего super.

Переопределить Создание модели Serialzier

def create(self, validated_data):
        if validated_data.get('password'):
            validated_data['password'] = make_password(validated_data['password'])
        return super(UserSerializer, self).create(validated_data)
.

Обязательно импортируйте

from django.contrib.auth.hashers import make_password
.

Мы можем написать сигнал в пользователе, чтобы решить это.

def create_hash(sender, instance=None, *args, **kwargs):
passwd = instance.password
instance.set_password(passwd)


pre_save.connect(create_hash, sender=User)
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top