Django Rest Framework - проверьте пароль для проверки формы - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь проверить форму через DRF, но для подтверждения пользователю потребуется ввести свой пароль. Я не могу заставить его работать. Вот мой текущий вид и сериализатор. Для формы «изменить адрес электронной почты» необходимо заполнить два поля: адрес электронной почты и пароль пользователя. Это для отдельной модели электронной почты. Сериализатор:

class UpdateEmailAddressSerializer(serializers.ModelSerializer):

    class Meta:
        model = EmailAddress
        fields = ('email',)

И APIView:

class UpdateEmailAPI(APIView):

permission_classes = (IsAuthenticated,)
serializer_class = UpdateEmailAddressSerializer

def post(self, request, user, format=None):
    user = User.objects.get(username=user)
    serializer = UpdateEmailAddressSerializer(data=request.data, instance=user)
    if serializer.is_valid():

        ## logic to check and send email

        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)  

Я не уверен, где разместить пароль или что с ним делать. Это от самой пользовательской модели. Когда я попытался добавить пароль к полям в сериализаторе UpdateEmail, он закончил тем, что обновил пароль пользователя простым текстом и лишил этот пользовательский объект возможности использовать этот пароль.

Я просто хочу проверить пароль пользователя для подтверждения этой формы. Есть ли очевидный способ сделать это?

EDIT

Когда я пытаюсь ввести «пароль» в сериализатор, появляется сообщение «Имя поля password недопустимо для модели EmailAddress». Поэтому, когда я пытаюсь внести это, например,

password = serializers.CharField(required=True)

или попробуйте:

## UserPasswordSerializer 
class UserPasswordSerializer(serializers.ModelSerializer):

class Meta:
    model = User
    fields = (
        'password',
        )

## In UpdateEmailAddressSerializer
password = UserPasswordSerializer()

Я получаю эту ошибку при отправке формы на DRF:

Получил AttributeError при попытке получить значение для поля password на сериализаторе UpdateEmailAddressSerializer. поле сериализатора может быть названо неправильно и не совпадать ни с одним атрибут или ключ в экземпляре EmailAddress. Оригинальное исключение текст был: у объекта 'EmailAddress' нет атрибута 'пароль'

Так что, похоже, мне говорят, что пароль не является частью модели EmailAddress, которая является правильной. Но я не могу понять, как просто проверить пароль рядом с формой сообщения, не делая его частью EmailAddress.

1 Ответ

0 голосов
/ 11 ноября 2018

Я думаю, вы можете попробовать вот так:

class UpdateEmailAddressSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)
    class Meta:
        model = EmailAddress
        fields = ('email', 'password',)

    def create(self, validated_data):
       validated_data.pop('password', None)
       return super(UpdateEmailAddressSerializer, self).create(validated_data)

    def update(self, instance, validated_data):
         if instance.check_password(validated_data.get('password')):
               instance.email = validated_data.get('email', instance.email)
         # else throw validation error
         return instance
...