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