DRF Неполевые ошибки: Невозможно войти в систему с предоставленными учетными данными
Я пытаюсь понять, почему мое приложение внезапно не позволяет мне войти в систему пользователя после внесения изменений в его профиль. У меня есть вложенный сериализатор User с полями сериализатора профиля (onetoOne), использующий Djoser для урлов. Когда я пытаюсь обновить профиль пользователя с конечной точки api, он обновляется, но выдает ошибку, что аватар не имеет связанного с ним файла. Я подумал, что если я добавлю "required=False" в ProfileSerializer, то это сведет на нет такое поведение. Пожалуйста, помогите, это сводит меня с ума, я гуглил и не нашел ответа почему. Я думаю, что дело в моем методе create в классе UserSerializer. Он также не сохраняет аватар, если другие поля изменены в объекте профиля. Очень странно. Все работало нормально, а теперь почему-то не регистрирует пользователей.
Вот модель:
class Profile(models.Model):
user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE)
name = models.CharField(max_length=100, blank=True, null=True)
occupation = models.CharField(max_length=100, blank=True, null=True)
residence = models.CharField(max_length=100, blank=True, null=True)
email = models.CharField(max_length=100, blank=True, null=True)
active_id = models.BooleanField(default=True)
avatar = models.ImageField(null=True, blank=True, upload_to ='uploads/profile_pics/',default='uploads/default.jpg')
def __str__(self):
return self.user.username
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
img = Image.open(self.avatar.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.avatar.path)
Вот сериализаторы:
class ProfileSerializer(serializers.ModelSerializer):
user = serializers.StringRelatedField(read_only=True)
class Meta:
model = Profile
fields = ("__all__")
class ProfileStatusSerializer(serializers.ModelSerializer):
# user_profile = serializers.StringRelatedField(read_only=True)
class Meta:
model = ProfileStatus
fields = "__all__"
class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(required=False, allow_null=True, partial=True)
parser_class = (FileUploadParser,)
class Meta:
model = User
fields = ['username', 'profile','password', 'id']
extra_kwargs = {"password":{'write_only': True}}
def update(self, instance, validated_data):
if 'profile' in validated_data:
nested_serializer = self.fields['profile']
nested_instance = instance.profile
nested_data = validated_data.pop('profile')
nested_serializer.update(nested_instance, nested_data)
return super(UserSerializer, self).update(instance, validated_data)
def create(self, validated_data):
return User.objects.create_user(
username = validated_data['username'], # HERE
password = validated_data['password'])
Пожалуйста, остановитесь.
Решено. Мне нужно было добавить поля validated_data в метод create.
def create(self, validated_data):
return User.objects.create_user(
validated_data['username'],None,validated_data['password'])