我将从django rest框架开始我的第一个项目。
我已经创建了我自己的自定义用户通过更改登录电子邮件。
我想先注册一个用户,但我已经被困住了。我得到了错误'confirm_password‘是一个无效的关键字参数,当我试图创建一个函数时。
这是我的连载:
class AccountSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=False)
confirm_password = serializers.CharField(write_only=True, required=False)
class Meta:
model = Account
fields =('id', 'email', 'username', 'date_joined', 'last_login', 'first_name', 'last_name', 'password', 'confirm_password')
read_only_fields = ('last_login', 'date_joined')
def create(self, validated_data):
return Account.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.first_name = validated_data.get('first_name', instance.first_name)
instance.last_name = validated_data.get('last_name', instance.last_name)
instance.save()
password = validated_data.get('password', None)
confirm_password = validated_data.get('confirm_password', None)
if password and confirm_password and password == confirm_password:
instance.set_password(password)
instance.save()
update_session_auth_hash(self.context.get('request'), instance)
return instance以下是我的看法:
class AccountViewSet(viewsets.ModelViewSet):
# lookup_field = 'username'
queryset = Account.objects.all()
serializer_class = AccountSerializer
def get_permissions(self):
if self.request.method in permissions.SAFE_METHODS:
return (permissions.AllowAny(),)
if self.request.method == 'POST':
return (permissions.AllowAny(),)
return (permissions.IsAuthenticated(), IsAccountOwner(),)
def create(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
Account.objects.create_user(**serializer.validated_data)
return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
return Response({
'status': 'Bad request',
'message': 'les données ne sont pas valides'
}, status=status.HTTP_400_BAD_REQUEST)下面是我从django-custom-user扩展的自定义用户
class Account(AbstractEmailUser):
username = models.CharField(unique=True, max_length=50)
first_name = models.CharField(blank=True, null=True, max_length=50)
last_name = models.CharField(blank=True, null=True, max_length=50)我知道我得到了错误,因为在我的模型中没有字段确认密码,但是如何在没有双重输入的情况下验证密码呢?
我找不到任何关于django rest框架注册/登录的文档或教程,所以如果您知道一些,我真的很感兴趣!
发布于 2015-04-23 18:53:06
多读一点,似乎ModelSerializer不支持可写的非模型字段,因此可以使用普通的Serializer类,如下所示:
class AccountSerializer(serializers.Serializer):
email = serializers.EmailField(required=True)
username = serializers.CharField(required=True)
password = serializers.CharField(required=True)
confirmed_password = serializers.CharField(write_only=True)
# ... and your other fields ...
def validate(self, data):
if data['password'] != data['confirmed_password']:
raise serializers.ValidationError("passwords not match")
return data
def create(self, validated_data):
# ... your create stuff ...
def update(self, instance, validated_data):
# ... and your update stuff ...然后,您可以像视图集中的表单一样使用序列化程序:
In [17]: data = {'confirmed_password': '1234',
'email': 'hello@world.com',
'password': '1234',
'username': 'test'}
In [18]: serializer = AccountSerializer(data=data)
In [19]: serializer.is_valid()
Out[19]: True
In [20]: serializer.data
Out[21]: {'email': u'hello@world.com', 'username': u'test', 'password': u'1234'}In [23]: data = {'confirmed_password': '123456789',
'email': 'hello@world.com',
'password': '1234',
'username': 'test'}
In [24]: serializer = AccountSerializer(data=data)
In [25]: serializer.is_valid()
Out[26]: False
In [27]: serializer.errors
Out[27]: {u'non_field_errors': [u'passwords not match']}这里是doc,您可以在这里阅读更多关于serializers的信息,希望这会有所帮助。
https://stackoverflow.com/questions/29830937
复制相似问题