2
我想通过结合Django Rest Framework和Angular来实现验证,但是我受到用户信息更新的困扰。
Angular使用PUT方法将它发送给Django,Django通过View“AuthInfoUpdateView”接受请求。
如何使用Django Rest Framework更新用户信息?
class AuthInfoUpdateView(generics.GenericAPIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = AccountSerializer
lookup_field = 'email'
queryset = Account.objects.all()
def put(self, request, *args, **kwargs):
serializer = AccountSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
此时,Django接受如下请求。
request.data = {'email': '[email protected]', 'username': 'test3', 'profile': 'i am test3'}
request.user = [email protected]
并且序列化器正在执行如下。
from django.contrib.auth import update_session_auth_hash
from rest_framework import serializers
from .models import Account, AccountManager
class AccountSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=False)
class Meta:
model = Account
fields = ('id', 'username', 'email', 'profile', 'password')
def create(self, validated_data):
return Account.objects.create_user(request_data=validated_data)
def update(self, instance, validated_data):
insntance.username = validated_data.get('username', instance.username)
insntance.email = validated_data.get('email', instance.email)
insntance.profile = validated_data.get('profile', instance.profile)
instance = super().update(instance, validated_data)
return instance
我试图在这种实现中更新来自Angular的用户,并返回以下响应。
"{"username":["account with this username already exists."],"email":["account with this email address already exists."]}"
据认为,这是因为您没有指定要更新的记录,但有没有一种方法可以巧妙地解决它而无需更改当前配置?
我需要你的帮助。
您正在使用哪个版本的django rest框架?从3.0开始,'PUT'总是被认为是更新 http://www.django-rest-framework.org/api-guide/generic-views/#put-as-create – Arun
@arun我正在使用djangorestframework == 3.6.3。 – xKxAxKx
你写了'insntance'而不是'instance'。如果它不是拼写错误,则不会修改您认为的对象。 – LSerni