Django REST framework как создать нового пользователя?
Я пытаюсь получить POST-запросы в моем Django-приложении, используя Django REST framework, но по какой-то причине мне всегда не удается получить запрос. Либо я получаю ошибку разрешения при создании представления на основе класса. Если я создаю представление на основе функции, я всегда сталкиваюсь с ошибкой валидации, и я немного расстроен сложностью DRF.
Посмотрите на следующее представление для создания объекта User:
views.py
@api_view(['GET', 'POST'])
@permission_classes([AllowAny])
def user_create(request):
if request.method == 'POST':
print(request.data)
serializer = CreateUserProfileSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({
"user": UserSerializer(user, context=serializer.data)
})
serializers.py
class CreateUserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ('id', 'user',)
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User.objects.create(
validated_data['user'],
validated_data['password'])
user.save()
return user
ошибка при отправке POST на конечную точку:
File "/App/App_API/serializers.py", line 36, in create
validated_data['password'])
KeyError: 'password'
Почему так? Если я сделаю следующее в коде моих представлений:
print(request.data)
На консоли я вижу следующее:
<QueryDict: {'user': ['peter432'], 'password': ['OUBIfwiowef']}>
Может кто-нибудь поделиться своим способом создания пользователя.
Правильным способом является использование User.objects.create_user
.
См. этот ответ: https://stackoverflow.com/a/23482284/117831
2 ошибки:
- Пароля нет в
fields
, поэтому его нет вvalidated_data
.
- Вы сохраняете хэшированный пароль, вам нужно сначала создать экземпляр пользователя на уровне python и хэшировать пароль, как:
password = validated_data.pop('password')
u1 = User(....)
u1.set_password(password)
u1.save()
Это работает для меня:
views.py
@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
if request.method == 'POST':
print(request.data)
serializer = CreateUserSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return JsonResponse(serializer.data, safe=False)
serializers.py
class CreateUserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ('user', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
print(validated_data)
password = validated_data.pop('password')
print(password)
user = User.objects.create_user(
validated_data['user'],
)
user.set_password(password)
user.save()
return user
Если вы удалите строку:
extra_kwargs = {'password': {'write_only': True}}
Он также покажет вам хэшированный пароль пользователя. Спасибо всем за ваши хорошие идеи