Как обновить пароль пользователя Auth в django rest framework

Я новичок в django rest framework. Я реализую простую функциональность входа, регистрации и забытого пароля, используя reactJs и django. Все функции работают хорошо, но проблема, с которой я столкнулся, заключается в том, что при регистрации пароли в базе данных шифруются, а затем сохраняются в базе данных, но при обновлении пароля новый пароль сохраняется точно таким же, каким его набрал пользователь. Я хочу, чтобы он также был зашифрован в базе данных, как и при регистрации.

Мой файл serializer.py

from dataclasses import fields
from rest_framework import serializers
from rest_framework_jwt.settings import api_settings
from django.contrib.auth.models import User


class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields='__all__'
        # fields = ('username','first_name', 'last_name', 'email')


class UserSerializerWithToken(serializers.ModelSerializer):

    token = serializers.SerializerMethodField()
    password = serializers.CharField(write_only=True)

    def get_token(self, obj):
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

        payload = jwt_payload_handler(obj)
        token = jwt_encode_handler(payload)
        return token

    def create(self, validated_data):
        password = validated_data.pop('password', None)
        instance = self.Meta.model(**validated_data)
        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance

    

    class Meta:
        model = User
        fields = ('token','first_name', 'last_name','email', 'username', 'password')

Мой файл views.py

Это url, который я использую для api

path('users/<int:id>/',UserList.as_view()),

А вот как я вызвал этот api из reactjs

function handleSubmit(e) {
    let user=JSON.parse(localStorage.getItem('matched_user_token'))[0]
    user.password=new_password
    e.preventDefault()
    if (ValidatePassword()) {
      fetch('http://localhost:8000/core/users/'+user.id+'/', {
        method: 'PUT',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(user)
      })
        .then(res => res.json())
        .then(json => {
          console.log("password changed successfully!"+json)
          localStorage.setItem('changed',true)
          navigate('/login')
        }).catch(errors=>console.log(errors))
    }
  }

Вам нужно переопределить метод сериализатора update следующим образом:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields='__all__' 

    def update(self, instance, validated_data):
        if 'password' in validated_data:
            password = validated_data.pop('password', None)
            instance.set_password(password)
        return super().update(instance, validated_data)
Вернуться на верх