1

Это сводит меня с ума ... Я читаю тонны сообщений о том, как хэш-пароль при создании пользователя, но по какой-то причине просто не работает, и я не могу аутентифицироваться.django rest framework - хэширование пароля

Я использую Джанго 1.8.1 и Джанго-покоя рамки 3.1.2

Мой код:

views.py:

class UserViewSet(mixins.CreateModelMixin, 
       mixins.RetrieveModelMixin, 
       mixins.ListModelMixin, 
       viewsets.GenericViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    permission_classes = (IsAuthenticated,) 

---- EDIT ----

С помощью этого кода пароль отображается как есть в базе данных и не хеширован, поэтому я не могу выполнить аутентификацию.

serializers.py:

class UserSerializer(serializers.ModelSerializer): 

class Meta: 
    model = User 
    fields = ('username', 'first_name', 'last_name', 'password') 
    extra_kwargs = {'password': {'write_only': True}} 

    def create(self, validated_data): 
     user = User(
      first_name=validated_data['first_name'], 
      username=validated_data['username'], 
      last_name=validated_data['last_name'] 
     ) 
     user.set_password(validated_data['password']) 
     user.save() 
     return user 

А также - что делает метод serializer.save() вызов ??

Любая идея ??? любая помощь будет оценена!

ответ

1

Сериализаторы не имеют метода post_save, даже не до v3. Вы должны быть путаны с post_save в общих представлениях. Общий вид pre_save и post_save крючков больше не существует, но заменены на perform_create и perform_update.

Вам нужно всего лишь сделать obj.set_password в методе create пользовательского сериализатора. В документах есть example, который делает именно то, что вы ищете.

+0

Спасибо, я попробую. И оставить метод create в UserViewSet как есть? А также, какой метод точно выполняет вызов serializer.save()? –

+0

Вы можете удалить метод create в своем представлении. serializer.save() знает, когда вызывать метод обновления или метод создания сериализатора. –

+0

Но разве URL не переводится в представление? Я имею в виду, без метода create в представлении ViewSet, как он будет знать, чтобы вызвать serializer.save()? Просто пытаюсь понять все это. –