は、良い答えを与えるのおかげで、それはいくつかのマイナーなポイントで良いかもしれません。
は、限り、あなたは本当にUpdateModelMixinで動作しませんが、直接要求ユーザーインスタンスで、あなたはUpdateAPIViewを使用する必要はありません。単純なAPIViewで十分です。
また、パスワードを変更すると、ランダムコンテンツを含む200の代わりにstatus.HTTP_204_NO_CONTENT
を返すことができます。
ところで、保存する前に新しいパスワードを確認するのを忘れないでください。あなたが作成していないときに "パスワード"を更新時に許可するのは残念です。
だから私は私のプロジェクトで次のコードを使用します。
from django.contrib.auth.password_validation import validate_password
class ChangePasswordSerializer(serializers.Serializer):
"""
Serializer for password change endpoint.
"""
old_password = serializers.CharField(required=True)
new_password = serializers.CharField(required=True)
def validate_new_password(self, value):
validate_password(value)
return value
とビューのために:
class UpdatePassword(APIView):
"""
An endpoint for changing password.
"""
permission_classes = (permissions.IsAuthenticated,)
def get_object(self, queryset=None):
return self.request.user
def put(self, request, *args, **kwargs):
self.object = self.get_object()
serializer = ChangePasswordSerializer(data=request.data)
if serializer.is_valid():
# Check old password
old_password = serializer.data.get("old_password")
if not self.object.check_password(old_password):
return Response({"old_password": ["Wrong password."]},
status=status.HTTP_400_BAD_REQUEST)
# set_password also hashes the password that the user will get
self.object.set_password(serializer.data.get("new_password"))
self.object.save()
return Response(status=status.HTTP_204_NO_CONTENT)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
なぜModelSerializerが過労?このようにして、ビューの更新メソッドにシリアライゼーションコードがたくさんあります。それは良いですか? –