Доступ к переменной метода - PullRequest
4 голосов
/ 16 октября 2019

Я хочу получить доступ к переменной gallery_path из моего метода create_directory в качестве параметра в моем поле gallery модели. Возможно ли это?

class Category(models.Model):
    category_title = models.CharField(max_length=200)
    category_image = models.ImageField(upload_to="category")
    category_description = models.TextField()
    slug = models.SlugField(max_length=200, unique=True, default=1)
    gallery = models.ImageField(upload_to=gallery_path)

    def create_directory(self):
        global gallery_path
        gallery_path = os.path.abspath(
            os.path.join(settings.MEDIA_ROOT, self.slug))
        if not os.path.isdir(gallery_path):
            os.mkdir(gallery_path)

    def save(self, *args, **kwargs):
        if not self.pk:
            self.create_directory()
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        shutil.rmtree(os.path.join(settings.MEDIA_ROOT, self.slug))
        # os.rmdir(os.path.join(settings.MEDIA_ROOT, self.slug))
        super().delete(*args, **kwargs)

    class Meta:
        verbose_name_plural = "Categories"

    def __str__(self):
        return self.category_title

Спасибо за любую помощь

1 Ответ

1 голос
/ 17 октября 2019

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

Но вы можете передать функцию callable параметру «upload_to», и он будет вызываться каждый раз при загрузке нового файла:

class MyModel(models.Model):

    # Need to be defined before the field    
    def get_image_path(self, filename): 
        gallery_path = os.path.abspath(
        os.path.join(settings.MEDIA_ROOT, self.slug))
        if not os.path.isdir(gallery_path):
            os.mkdir(gallery_path)
        return os.path.join(gallery_path, filename)

    gallery = models.ImageField(upload_to=get_image_path)

Документация: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField.upload_to

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...