Django: Как загрузить изображение в папку с именем статьи - PullRequest
1 голос
/ 18 марта 2020

Я определил две модели Article, Article_photos. Фотографии, представленные в каждой статье, хранятся в соответствующей Article_photos модели. Я намерен таким образом хранить несколько фотографий для каждой статьи. Я хочу, чтобы каждая фотография была загружена в папку с помощью , назвав папку таким образом : {slug} _images .

Это Article модель:

class Article(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='Author')
    article_title = models.TextField()
    article_content = models.TextField()
    slug = models.SlugField(max_length=30, blank=True)
    ...

    def save(self, *args, **kwargs):
        self.slug = slugify(self.article_title)
        super(Article, self).save(*args, **kwargs)

И модель Article_photos для хранения одной или нескольких фотографий:

class Article_photo(models.Model):
    article = models.ForeignKey('Article', on_delete=models.CASCADE)
    photo = models.ImageField(upload_to='{}_images'.format(article.slug))

Теперь, когда я запускаю makemigrations, возвращается эта ошибка: AttributeError: 'ForeignKey' object has no attribute 'slug'.

Как переименовать папку в шаблоне, который я хочу?

1 Ответ

3 голосов
/ 18 марта 2020

Вам необходимо использовать здесь функцию, например:

def <b>article_photo_location</b>(self, filename):
    return '{}_images/{}'.format(self.article.slug, filename)

class Article_photo(models.Model):
    article = models.ForeignKey('Article', on_delete=models.CASCADE)
    photo = models.ImageField(upload_to=<b>article_photo_location</b>)

Обратите внимание, что вы должны не вызывать функцию, вы передаете ссылку функции к параметру upload_to=&hellip; [Django -doc] .

Примечание : обычно a Django моделям, как и всем классам в Python, присваивается имя в PerlCase , а не snake_case , поэтому оно должно быть: ArticlePhoto вместо Article_photo.

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