Как дать начальные данные, чтобы положить метод, Django (я хочу создать страницу редактирования профиля) - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть эта функция Put:

def get_object(self, pk):
    try:
        return User.objects.get(pk=pk)
    except Exception as e:
        raise Http404

def put(self, request, pk, format=None):
            user = self.get_object(pk)
            serializer = UserSerializer(user, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data)
            return Response(serializer.errors,satus=status.HTTP_400_BAD_REQUEST)

здесь, когда вы хотите редактировать пользователя, вам нужно ввести поле, которое вы хотите изменить, и новое значение для него.Но проблема здесь в том, что имя пользователя и пароль являются обязательными для заполнения, и даже если вы не хотите их менять, вам нужно ввести их.Я хочу, чтобы был способ определить (внутри моего кода), что в полях имени пользователя и пароля автоматически заполняются текущие имя пользователя и пароль, и если пользователь хочет изменить их, введите его новое значение.

1 Ответ

0 голосов
/ 29 декабря 2018

Во-первых, вы можете захотеть использовать существующий метод put и get_object в представлениях и наборах API DRF, поскольку они очень похожи на те, что у вас есть.

Что касается вашего вопроса, то в бэкэнде уже есть всенужно, так что вам нужно сделать следующее:

  1. Отправить запрос на получение для извлечения объекта пользователя
  2. Показать значения в форме и позволить пользователю редактировать поля, которые онхочет
  3. Отослать новые значения, включая старые, которые не были отредактированы в бэкэнд, используя запрос put
  4. Представление разделяет их, проверяет и обновляет объект пользователя

Это действительно все, что вам нужно, и, как вы можете видеть, в бэкэнде уже есть все, что нужно.

Имейте в виду, однако, что поля пароля не должны редактироваться так же, как остальныеперед сохранением нужно хешироватьОбычной практикой является создание отдельной страницы смены пароля, где вы можете корректно обновлять пароль.Однако, если вы все еще хотите обновить пароль так же, как остальные, то вы можете сделать что-то вроде этого в вашем сериализаторе:

def update(self, instance, validated_data):
    password = validated_data.pop('password', None)
    instance = super().update(instance, validated_data)
    if password:
        instance.set_password(password)
    return instance

ДЛЯ ЧАСТИЧНОГО ОБНОВЛЕНИЯ

Если вы хотите иметь возможность отправлять только поля, измененные в бэкэнд, используйте метод PATCH HTTTP, который используется для частичных обновлений в терминологии REST.Он уже был реализован в DRF, чтобы разрешить пропуск значений для обязательных полей, поэтому вам не нужно реализовывать его самостоятельно

...