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()
  • Вопрос задан
  • 205 просмотров
Решения вопроса 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


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

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

Похожие вопросы