我正在尝试使用带有two different methods
使用method 1
一切正常,但它会给出
这个问题:
https://stackoverflow.com/questions/43952178/django-rest-framework-user-registration-confusion
对于method 2
,它会出现以下错误,但会在后端创建用户
/ api / users / register /
中的AttributeError获得AttributeError时 尝试在序列化程序上获取字段
password2
的值UserCreateSerializer
。序列化程序字段可能已命名 错误且不匹配User
实例上的任何属性或键。 原始例外文字是:'用户'对象没有属性 '密码2'
代码:
from django.contrib.auth import get_user_model
from rest_framework.exceptions import ValidationError
from rest_framework.serializers import (ModelSerializer,CharField)
User = get_user_model()
class UserCreateSerializer(ModelSerializer):
password2 = CharField(label='Confirm Password')
class Meta:
model = User
fields = [
'username',
'password',
'password2',
'email',
]
extra_kwargs = {
'password' : {'write_only': True},
'password2': {'write_only': True},
}
def validate_password(self, value):
data = self.get_initial()
password = data.get('password2')
password2 = value
if password != password2:
raise ValidationError('Passwords must match')
return value
def validate_password2(self, value):
data = self.get_initial()
password = data.get('password')
password2 = value
if password != password2:
raise ValidationError('Passwords must match')
return value
方法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
方法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
注意:使用Python3,Django 10.7& Django REST框架3
答案 0 :(得分:0)
您方法中的问题是您传递的是password2,而不是User模型的属性。
通过阅读您的代码,我认为您可以尝试这样的事情,
您可以对此进行对象范围的验证,而不是重复验证每个密码字段。
def validate(self, data):
password = data.get('password')
confirm_password = data.pop('password2')
if password != confirm_password:
raise ValidationError('.............')
return data
你写的创建方法就足够了,我希望...... 尝试这个,如果有任何问题,请告诉我..
修改强>
编辑您的创建方法
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。
答案 1 :(得分:0)
请尝试以下操作:将write_only=True
添加到password2
class UserCreateSerializer(ModelSerializer):
password2 = CharField(label='Confirm Password', write_only=True)
...