2016-05-16 3 views
1

Я работаю над проектом галереи изображений в DJango, только ради этого. И хорошо, у меня есть класс с именем Gallery и класс с именем ImageGallery.Django-models: использование поля от внешнего ключа

Класс с именем галереи будет выглядеть следующим образом:

class Gallery(models.Model): 
gallery = models.ForeignKey(Gallery, related_name="parent_gallery") 
title = models.CharField(max_length=200) 
folder = models.CharField(max_length=200) # ex: images/galleries/slugify(self.title) 

class ImageGallery(models.Model): 
gallery = models.ForeignKey(Gallery, related_name="parent_gallery") 
title = models.CharField(max_length=200) 
image = models.ImageField(upload_to=self.gallery.folder) 

Ну, последняя строка кода, что я хочу знать, если его можно или любой другой тонкой замены для него.

В DJango-admin я хочу, чтобы иметь возможность добавлять записи в таблицу ImageGallery и при выборе Gallery Я хотел бы использовать, изображения, которые будут сохранены в папке, указанной в поле gallery.folder.

Каков наилучший способ обойти это? Я не закончил писать два класса, но я сомневаюсь, что они будут так работать. Заранее спасибо. :-)

ответ

3

FileField.upload_to определяется следующим образом

Этот атрибут обеспечивает способ настройки каталога загрузки и файл имя, и может быть установлен двумя способами. В обоих случаях значение передается методу Storage.save(). ... upload_to также может быть вызываемым, , например функцией. Это будет вызываться для получения пути загрузки, , включая имя файла. Этот вызываемый должен принимать два аргумента, а возвращает путь в стиле Unix (с косой чертой), который должен быть передан в систему хранения . Два аргумента:

Но self.gallery.folder не подлежит обсуждению. Что вам нужно настроить функцию вдоль линий, приведенных в этом примере

def get_upload_path(instance, filename): 
    return '{0}/{1}'.format(instance.gallery.folder, filename) 

И ваша модель изменится

image = models.ImageField(upload_to=get_upload_path) 
+0

Ничего себе, я не знаю, как я пропустил это. Это в стороне, путь - это довольно удивительно. yay для Django! – gglasses