1

in my django project, I use AbstractBaseUser to register a new user. I use set_password to define his password for it to be encrypted. Now I want to create a view for editing a profil. I want the password to be able to be change and to be encrypted. I've already create a view, but the password isn't encypted in the databse when I edit it... These are my files: models.py

class memberArea(AbstractBaseUser):
    username = models.CharField(max_length=255)
    email = models.EmailField(max_length=255, unique=True)
    phone = models.TextField()
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    deliveryAddress = models.TextField()
    postalCode = models.CharField(max_length=255)
    forget = models.TextField(null=True, blank=True)
    city = models.CharField(max_length=255)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'phone', 'deliveryAddress', 'postalCode', 'city']

    objects = MyAccountManager()

serializers.py

from django.contrib.auth.hashers import make_password
                  ...

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = memberArea
        fields = ['username', 'email', 'phone', 'password', 'deliveryAddress', 'postalCode', 'city']
        extra_kwargs = {
            'password': {'write_only': True},
        }

        def validate_password(self, raw_password):
            return make_password(raw_password)

views.py

#Edit account
@api_view(['PUT', ])
def edit_account(request, pk):
    try:
        account = memberArea.objects.get(pk=pk)
    except memberArea.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'PUT':
        serializer = AccountSerializer(account, data=request.data)
        data = {}
        if serializer.is_valid():
            serializer.save()
            data['response'] = 'Account updated with success !'
            return Response(data)
        return Response(serializer.errors)

Thanks by advance for your help

Bastien
  • 1,447
  • 3
  • 9
  • 19
  • 1
    **`validate_password(...)`** must be under `AccountSerializer` class, not `AccountSerializer.Meta` – JPG Jul 06 '20 at 10:45

0 Answers0