我遇到以下问题:即使数据库中的用户名和密码正确,我执行PUT请求(更改字段,例如first_name,last_name,address)后,登录请求也会返回“无法使用提供的凭据登录”。
以下用于发出登录请求的视图。
class RetrieveAuthToken(ObtainAuthToken):
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data,
context={'request': request})
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, created = Token.objects.get_or_create(user=user)
resp = Response({
'token': token.key,
'user_id': user.pk,
'email': user.email,
'role': user.role,
})
return resp
这些是给我的用户和用户注册的:
from users.models import User
from users.serializers import UserSerializer, RegistrationSerializer
from rest_framework import viewsets, generics
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
# Create your views here.
class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
class RegistrationView(generics.CreateAPIView):
model = User
serializer_class = RegistrationSerializer
我的序列化器看起来像这样:
from rest_framework import serializers, status
from users.models import User
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(style={'input_type': 'password'})
class Meta:
model = User
fields = '__all__'
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = super(UserSerializer, self).create(validated_data)
user.set_password(validated_data['password'])
user.save()
return user
def update(self, instance, validated_data):
instance = super(UserSerializer, self).update(instance, validated_data)
instance.set_password(validated_data['password'])
instance.save()
return instance
class RegistrationSerializer(serializers.ModelSerializer):
password = serializers.CharField(style={'input_type': 'password'}, write_only=True)
def create(self, validated_data):
user = super(RegistrationSerializer, self).create(validated_data)
user.set_password(validated_data['password'])
user.save()
return user
class Meta:
model = User
fields = ['email', 'username', 'password']
def update(self, instance, validated_data):
instance = super(UserSerializer, self).update(instance, validated_data)
instance.set_password(validated_data['password'])
instance.is_active = True
instance.save()
return instance