Python Django REST框架用户注册验证混乱
我正在尝试使用两种不同的方法向Django REST API注册用户 使用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
方法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(用户名=用户名,电子邮件=电子邮件),然后设置密码。