Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST框架用户注册验证混乱_Python_Django_Rest_Api_Django Rest Framework - Fatal编程技术网

Python Django REST框架用户注册验证混乱

Python Django REST框架用户注册验证混乱,python,django,rest,api,django-rest-framework,Python,Django,Rest,Api,Django Rest Framework,我正在尝试使用两种不同的方法向Django REST API注册用户 使用方法1一切正常,但 这个问题: 使用方法2会出现以下错误,但会在后端创建用户 AttributeError at/api/users/register/ 在什么时候发生了错误 正在尝试获取序列化程序上的字段password2的值 UserCreateSerializer。序列化程序字段可能已命名 不正确,并且与用户实例上的任何属性或键都不匹配。 原始异常文本为:“用户”对象没有属性 “密码2” 代码: def creat

我正在尝试使用两种不同的方法向Django REST API注册用户

使用
方法1
一切正常,但

这个问题:

使用
方法2
会出现以下错误,但会在后端创建用户

AttributeError at/api/users/register/

在什么时候发生了错误 正在尝试获取序列化程序上的字段
password2
的值
UserCreateSerializer
。序列化程序字段可能已命名 不正确,并且与
用户
实例上的任何属性或键都不匹配。 原始异常文本为:“用户”对象没有属性 “密码2”

代码:

def create(self, validated_data):
    username = validated_data['username']
    email = validated_data['email']
    password = validated_data['password']
    user_obj = User(
        username=username,
        email=email
    )
    user_obj.set_password(password)
    user_obj.save()
    return validated_data
 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
方法1:

def create(self, validated_data):
    username = validated_data['username']
    email = validated_data['email']
    password = validated_data['password']
    user_obj = User(
        username=username,
        email=email
    )
    user_obj.set_password(password)
    user_obj.save()
    return validated_data
 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
方法2:

def create(self, validated_data):
    username = validated_data['username']
    email = validated_data['email']
    password = validated_data['password']
    user_obj = User(
        username=username,
        email=email
    )
    user_obj.set_password(password)
    user_obj.save()
    return validated_data
 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
注意:使用Python3、Django 10.7和Django REST框架3


方法中的问题是传递的是password2,它不是用户模型的属性

通过阅读你的代码,我想你可以试试这样

您可以对每个密码字段执行对象范围的验证,而不是重复验证每个密码字段

def validate(self, data):
    password = data.get('password')
    confirm_password = data.pop('password2')
    if password != confirm_password:
        raise ValidationError('.............')
    return data
我希望你写的create方法就足够了。。 试试这个,如果有什么问题请告诉我

编辑

编辑您的创建方法

def create (self, validated_data):
    email = validated_data.get('email')
    username = validated_data.get('username')
    password = validated_data.get('password')
    try:
        user = User.objects.create(username=username, email=email)
        user.set_password(password)
        user.save()
        return user
    except Exception as e:
        return e

如果电子邮件、密码和用户名中的任何一个不可用,则可能会触发KeyError。

方法中的问题是传递的是password2,它不是用户模型的属性

通过阅读你的代码,我想你可以试试这样

您可以对每个密码字段执行对象范围的验证,而不是重复验证每个密码字段

def validate(self, data):
    password = data.get('password')
    confirm_password = data.pop('password2')
    if password != confirm_password:
        raise ValidationError('.............')
    return data
我希望你写的create方法就足够了。。 试试这个,如果有什么问题请告诉我

编辑

编辑您的创建方法

def create (self, validated_data):
    email = validated_data.get('email')
    username = validated_data.get('username')
    password = validated_data.get('password')
    try:
        user = User.objects.create(username=username, email=email)
        user.set_password(password)
        user.save()
        return user
    except Exception as e:
        return e

如果任何电子邮件、密码、用户名不可用,则可能会触发KeyError。

请尝试以下操作:在
密码2中添加
write\u only=True

class UserCreateSerializer(ModelSerializer):
    password2 = CharField(label='Confirm Password', write_only=True)
    ...

请尝试以下操作:在密码2中添加
write_only=True

class UserCreateSerializer(ModelSerializer):
    password2 = CharField(label='Confirm Password', write_only=True)
    ...

可能重复您的代码的可能重复,但它给出了
KeyError
。请您建议或指导如何将
password2
添加为
User
模型的属性。您可以发布整个堆栈跟踪吗?password2不是用户模型中的字段,因此在序列化时,必须在验证后或到达create方法之前删除password2。Else django引发属性错误。同样在创建方法中,尝试使用User.objects.create(username=username,email=email),然后设置密码。尝试了代码,但给出了
KeyError
。请您建议或指导如何将
password2
添加为
User
模型的属性。您可以发布整个堆栈跟踪吗?password2不是用户模型中的字段,因此在序列化时,必须在验证后或到达create方法之前删除password2。Else django引发属性错误。也可以在创建方法中尝试使用User.objects.create(用户名=用户名,电子邮件=电子邮件),然后设置密码。