2017-06-21 127 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 
相關問題