sergey_1990
@sergey_1990
1

Как отправить на фронтенд url картинки заглушки, если поле ImageField пустое?

вопрос банальный но что то я не могу победить его, есть модель пользователя и у него аватар, фронт уже написан поэтому там ничего не меняют, задача в сериализаторе при выдаче сущьности подставить url картинки-заглушки если нет аватарки!
class CustomUserModelSerializer(serializers.ModelSerializer):
    """give all users"""
    status = serializers.SerializerMethodField()
    class Meta:
        model= CustomUser
        fields = ('id','email','name','status', 'avatar')

    def get_status(self, obj):
        if obj.is_active == True:
            status = 'active'
        else:
            status = 'inactive'
        return status


class CustomUserListAPIView(generics.ListAPIView):
    """Выдаёт всех пользователей"""
    queryset = CustomUser.objects.all()
    serializer_class = CustomUserModelSerializer


# Задает путь к файлу аватарки
def upload_path_handler(instance, filename):
    return "images/{user}/ava_{file}".format(user=instance.email, file=filename)

class CustomUser(AbstractBaseUser, PermissionsMixin):
    """"USERNAME --- EMAIL полностью настраиваемая модель пользователя"""
    email = models.EmailField(_('email address'), unique=True)
    name = models.CharField (verbose_name='ФИО',  max_length=100, blank=False, null=False)
    is_staff = models.BooleanField(default=False, verbose_name='Персонал')
    is_active = models.BooleanField(default=False, verbose_name='Регистрация подтверждена')
    date_joined = models.DateTimeField(default=timezone.now, verbose_name='Дата регистрации' )
    phone_regex = RegexValidator(regex=r'^((\+7)+([0-9]){10})$', 
    message="ФОРМАТ дожен быть: +79998885555")
    phone = models.CharField(validators=[phone_regex], verbose_name='Телефон',
                             max_length=12, blank=False, null=False)
    avatar = models.ImageField(blank=True, upload_to=upload_path_handler,
								verbose_name = 'Аватар')

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.email

    class Meta:
        verbose_name = 'Пользователь'
        verbose_name_plural = 'Пользователи'


    def save(self):
        """при сохранении уменьшает аватар"""
		#Opening the uploaded image
        im = Image.open(self.avatar)
        output = BytesIO()
		#Resize/modify the image
        im = im.resize( (200,200) )
		#after modifications, save it to the output
        im.save(output, format='JPEG', quality=100)
        output.seek(0)
		#change the imagefield value to be the newley modifed image value
        self.avatar = InMemoryUploadedFile(output,'ImageField', "%s.jpg" %self.avatar.name.split('.')[0], 'image/jpeg', sys.getsizeof(output), None)
        super(CustomUser,self).save()
  • Вопрос задан
  • 167 просмотров
Решения вопроса 2
@serhiops
Python/JavaScript/C++
Попробуйте что-то такое, настройте под себя
class CustomUserModelSerializer(serializers.ModelSerializer):
    """give all users"""
    status = serializers.SerializerMethodField()
    class Meta:
        model= CustomUser
        fields = ('id','email','name','status', 'avatar')

    def get_status(self, obj):
        if obj.is_active == True:
            status = 'active'
        else:
            status = 'inactive'
        return status
 def to_representation(self, instance):
        response = super().to_representation(instance)
        response['avatar'] = instance.user.avatar if not None else "Путь к фото"
        return response
Ответ написан
sergey_1990
@sergey_1990 Автор вопроса
1
class CustomUserModelSerializer(serializers.ModelSerializer):
    """give all users"""
    status = serializers.SerializerMethodField()

    class Meta:
        model = CustomUser
        fields = ('id', 'email', 'name', 'status', 'avatar')

    def get_status(self, obj):
        if obj.is_active == True:
            status = 'active'
        else:
            status = 'inactive'
        return status

    def to_representation(self, instance):
        response = super().to_representation(instance)
        if not instance.avatar.name:
            request = self.context.get('request')
            response['avatar'] = request.build_absolute_uri("/media/images/avatar-test.jpg")
        return response


вот рабочий сериализатор, спасибо за ответ, который дал нужное направление!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы