У Django Rest Framework проблемы с созданием пользователей - PullRequest
0 голосов
/ 09 мая 2018

Я сделал три разных варианта views.py, и во всех них пользователь успешно создан, но в админ-панели я вижу Неверный формат пароля или неизвестный алгоритм хеширования .

views1.py

class UserCreteSerializer(ModelSerializer):
    class Meta:
        model=User
        fields = ['email', 'phone', 'password']
        extra_kwargs = {"password":
                           {"write_only": True}
                       }

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

views2.py

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

views3.py

def create(self, validated_data):
    return User.objects.create(**validated_data)

Почему это так? Все эти способы должны работать

settings.py

]    
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',

    )
}

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}

AUTH_USER_MODEL = 'customuser.User'

customuser.User

class User(AbstractUser):

    username = None    
    email = models.EmailField(validators=[email_regex], unique=True)
    phone = models.CharField(validators=[phone_regex], max_length=15) 
    is_pro = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['phone']

    objects = UserManager()

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
class UserCreteSerializer(ModelSerializer):
    password = serializers.CharField(max_length=32, write_only=True)
    class Meta:
        model=User
        fields = ('email', 'phone', 'password')

    def create(self, validated_data):
        password = validated_data.pop('password')
        try:
            user = User(**validated_data)
            user.set_password(password)
            user.save()
        except Exception as e:
            print (e)
            raise
        return user
0 голосов
/ 09 мая 2018

Вы должны возвращать объект user_obj после создания, а не validated_data, который содержит необъявленное поле password в вашем методе create в views1.py

def create(self, validated_data):
                email = validated_data['email']
                phone = validated_data['phone']
                password = validated_data['password']
                user_obj = User(
                    email = email,
                    phone = phone

                )
                user_obj.set_password(password)
                user_obj.save()
                return user_obj
...