2017-06-21 41 views
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."]}"

据认为,这是因为您没有指定要更新的记录,但有没有一种方法可以巧妙地解决它而无需更改当前配置?
我需要你的帮助。

+0

您正在使用哪个版本的django rest框架?从3.0开始,'PUT'总是被认为是更新 http://www.django-rest-framework.org/api-guide/generic-views/#put-as-create – Arun

+0

@arun我正在使用djangorestframework == 3.6.3。 – xKxAxKx

+0

你写了'insntance'而不是'instance'。如果它不是拼写错误,则不会修改您认为的对象。 – LSerni

回答

1

使用

class AuthInfoUpdateView(generics.UpdateAPIView): 

使用HTTP方法补丁partial_update您的实例。

method PATCH -> partial update instance 
method PUT -> update instance 
相关问题