Получение имени загруженного изображения с помощью ImageField в Django и как дать автоматически сгенерированное имя измененному изображению перед сохранением - PullRequest
0 голосов
/ 08 января 2019

1. ПОЛУЧЕНИЕ ИМЕНИ ЗАГРУЖЕННОГО ИЗОБРАЖЕНИЯ С ИСПОЛЬЗОВАНИЕМ ImageField: Я использую ImageField для хранения изображения, полученного из почтового запроса по определенному пути. он возвращает путь к изображению вместо имени изображения

Это моя модель: image_ref - глобальная переменная

class IMGResize(models.Model):
        image = models.ImageField(upload_to='ImgResize', blank=True)
class Meta:
        db_table = 'imgresize'

    def __str__(self):
        return self.image



    def save(self,force_insert=False, force_update=False, using=None):
        if not self.image:
           return  
        super(IMGResize, self).save()   
        global image_ref
        image_ref = self.image 
        super(IMGResize, self).save()

Здесь генерируется имя по умолчанию для изображения, как я могу получить имя изображения?

2. как автоматически сгенерировать имя для изображения с измененным размером:

Здесь, в моей предыдущей модели, я получаю какое-то изображение, которое пытаюсь изменить размер и сохранить по другому пути, используя другую модель в том же файле models.py.

Это моя модель:

from .resize_code import image_resize
    class Profile(models.Model):
        image = models.ForeignKey(IMGResize, related_name='profiles', on_delete=models.CASCADE)
        name=models.CharField(max_length=10)
        image_width=models.PositiveIntegerField(null=True, blank=False)
        image_height=models.PositiveIntegerField(null=True, blank=False)


        class Meta:
            db_table = 'profiles'
            unique_together=('name','image')

        def __str__(self):
            return self.name

        def save(self,force_insert=False, force_update=False, using=None):
            global image_ref
            super(Profile, self).save()
            image_resize(self,image_ref)
            super(Profile, self).save()

вот мой файл resize_code.py:

def image_resize(self,image,force_insert=False, force_update=False, using=None):
        if not image:
           return  
        img = Image.open(os.path.abspath(str(image)), 'r')
        img = resize_contain(img, [self.image_width, self.image_height])
        path='resized_images/contain.jpeg'
        img.save(path, img.format)

Здесь, в resize_code.py, я жестко кодирую имя изображения с измененным размером, а не генерирую его каждый раз (путь = 'resized_images / Содержит.jpeg')

Вот мой файл serializer.py:

class profilesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('name','image_width','image_height',)

    class IMGResizeSerializer(serializers.ModelSerializer):

        profiles = profilesSerializer(many=True,read_only=False)
        image = Base64ImageField()
        class Meta:
            model = IMGResize
            fields = ('id','image','profiles',)

        def create(self, validated_data):
            profiles_data = validated_data.pop('profiles')
            image = IMGResize.objects.create(**validated_data)
            for profile_data in profiles_data:
                Profile.objects.create(image=image, **profile_data)
            return image

Спасибо

1 Ответ

0 голосов
/ 08 января 2019

Вы можете получить имя загруженного изображения из соответствующего представления. Смотрите пример ниже,

def image_upload_view(request):
    all_files = request.FILES  # will be a 'dict' like object
    specific_file = all_files['some_key']  # this is your image in "InMemmoryFile" type
    image_name = specific_file.name  # this will be the name
    # your code

Загруженный файл будет иметь тип InMemoryUploadedFile, который является подклассом UploadedFile. Имеет атрибут name, который содержит имя загруженного файла

...