Добавление поля custom_password в UserSerializer без его регистрации в модели User в Django REST API
Мне нужен способ добавить поле confirm_password в данные, которые возвращает CreateUserView, не создавая его явно в моей модели пользователя. Я попытался сделать следующее, но это вызвало ошибку TypeError at /user/create/ User() got unexpected keyword arguments: 'confirm_password'
.
Как я могу решить эту проблему?
Спасибо за все ответы
Вот мой код:
serializer.py
class CreateUserSerializer(serializers.ModelSerializer):
confirm_password = serializers.CharField(
max_length=100, write_only=True, required=False
)
class Meta:
model = User
fields = [
"id",
"email",
"password",
"confirm_password",
"first_name",
"last_name",
]
extra_kwargs = {"password": {"write_only": True}, "id": {"read_only": True}}
def create(self, validated_data):
return User.objects.create_user(**trim_spaces_from_data(validated_data))
views.py
class CreateUserView(CreateAPIView):
permission_classes = [permissions.AllowAny]
serializer_class = CreateUserSerializer
def create(self, request, *args, **kwargs):
queryset = User.objects.filter(email=request.data["email"])
if queryset.exists():
raise CustomUserException("Provided email address is already in use")
if not "confirm_password" in request.data.keys():
raise CustomUserException("Confirm password field is required")
if not request.data["password"] == request.data["confirm_password"]:
raise CustomUserException("Passwords does not match")
serializer = CreateUserSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(status=200, data=serializer.data)
Создайте отдельный сериализатор для поля confirm_password (не сериализатор модели). Затем вызовите новый созданный сериализатор в сериализаторе вашего режима для поля confirm_password. В вашем коде поле confirm_password отсутствует в вашей модели пользователя, поэтому вы получаете эту ошибку.
first_name = serializers.CharField()
last_name = serializers.CharField()
username = serializers.CharField()
email = serializers.EmailField()=
password = serializers.CharField()
confirm_password = serializers.CharField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields.pop('confirm_password')
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
return user
просто введите confirm_password