Как сохранить изображение в настраиваемый путь к файлу в django admin?

#python #django

#python #django

Вопрос:

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

 class PhotosTags(models.Model):
    Tag_name = models.CharField('Tag Name', max_length=100, default='NA', unique=True)
    Description = models.TextField('Tag Description', max_length=200, blank=True)

    class Meta:
        verbose_name = 'Tags'
        verbose_name_plural = verbose_name
        ordering = ['Date_created']

    def __str__(self):
        return str(self.Tag_name)

class Photos(models.Model):
    Name = models.TextField('Photo Name', max_length=200, blank=True)
    Tag = models.ForeignKey(PhotosTags, on_delete=models.CASCADE, default=None)
    filepath = 'Gallery'
    Photo = models.ImageField(upload_to=filepath, blank=False)

    class Meta:
        verbose_name = 'Photos'
        verbose_name_plural = verbose_name
        ordering = ['Date_uploaded']

pre_save.connect(upload_photo, sender=Photos)
  

Здесь у каждого тега есть своя папка. Функция, которую я хочу реализовать, заключается в том, что когда я загружаю изображение, я могу выбрать определенный тег (через выбор «Tag»), а затем это изображение может быть загружено в эту папку. Я попытался использовать: signals для изменения filepath , но не удалось. Код, который я написал, является:

 def upload_photo(sender, instance, **kwargs):
    tardir = instance.Tag.Tag_name
    instance.filepath = 'Gallery' '/' tardir
    
  

Ответ №1:

Вы можете достичь этого, отправив upload_to path с помощью функции.

 import os

def path_generator(instance, filename):
    base, extension = os.path.splitext(os.path.basename(filename))
    file_dir = f"your_desired_path.{extension}"
    return file_dir

class Photos(models.Model):
    Name = models.TextField('Photo Name', max_length=200, blank=True)
    Tag = models.ForeignKey(PhotosTags, on_delete=models.CASCADE, default=None)
  
    Photo = models.ImageField(upload_to=path_generator, blank=False)

class Meta:
    verbose_name = 'Photos'
    verbose_name_plural = verbose_name
    ordering = ['Date_uploaded']
  

Комментарии:

1. Поскольку «Тег» в «Фотографиях» будет использоваться в пути, я не думаю, что ваш код работает. В любом случае спасибо.

2. Вы можете получить тег из экземпляра. Тег, экземпляр отправляется в функцию.

3. хммм, я неправильно понял ваш код. Наконец-то это работает, большое спасибо!