#python #django
#python #django
Вопрос:
serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(validated_data['username'], validated_data['email'])
user.set_password(validated_data['password'])
user.save()
return user
views.py
class RegisterAPI(generics.GenericAPIView):
serializer_class = RegisterSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
print("user = ",user)
return Response({
"user": UserSerializer(user, context=self.get_serializer_context()).data,
"token": AuthToken.objects.create(user)[1]
})
# Create your views here.
class LoginAPI(KnoxLoginView):
permission_classes = (permissions.AllowAny,)
def post(self, request, format=None):
serializer = AuthTokenSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
login(request, user)
return super(LoginAPI, self).post(request, format=None)
# Get User API
class UserAPI(generics.RetrieveAPIView):
permission_classes = [permissions.IsAuthenticated,]
serializer_class = UserSerializer
def get_object(self):
return self.request.user
Пароль не шифруется в указанном формате, и, следовательно, API входа также не работает. Он показывает —
«non_field_errors»: [
«Невозможно войти в систему с предоставленными учетными данными».
]
Кроме того, в панели администратора django отображается этот недопустимый формат пароля
Комментарии:
1. используете ли вы AbstractBaseUser
2. Я думаю, что нет, где это найти?
3. откуда вы получаете этого пользователя модели
4.
from django.contrib.auth.models import User
Я использовал это
Ответ №1:
Обновите метод создания класса «RegisterSerializer».
def create(self, validated_data):
user = User(validated_data['username'], validated_data['email'])
user.password = make_password(validated_data['password'])
user.save()
return user
И не забудьте импортировать метод make_password.
from django.contrib.auth.hashers import make_password
И вы создаете метод с неправильным отступом.
Serializer.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(validated_data['username'], validated_data['email'])
user.set_password(validated_data['password'])
user.save()
return user
Комментарии:
1. Я попробовал ваше решение, но та же ошибка все еще существует
2.Попробуйте:
user = User.objects.create_user( password=validated_data['password'], username=validated_data['username'], email=validated_data['email'])
return user
3. Вы проверили отступ в методе «создать» класса «RegisterSerializer»? Я думаю, что метод «create» не имеет правильного отступа.
4. Но в вашем вопросе serializer.py файл имеет неправильный отступ. Я обновил свой ответ, вы можете проверить его снова.
5. Большое спасибо. Теперь пароль зашифровывается. Я думал, что метод create находится внутри мета-класса.