Django Rest Framework在创建用户时遇到麻烦

时间:2018-05-09 13:27:27

标签: django django-rest-framework

我制作了三个不同的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 :(得分:1)

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

答案 1 :(得分:0)

您应该在创建后返回user_obj对象,而不是validated_datapassword 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