Ошибка естественна, учитывая, что на момент оценки
file = models.FileField(upload_to=UploadItem.get_directory)
класс UploadItem
еще не определен.Чтобы сделать это, вы можете сделать следующее:
def get_directory():
pass
class UploadItem(models.Model):
file = models.FileField(upload_to=get_directory)
class Meta:
abstract = True
Это не решит все ваши проблемы.Добавление (или переопределение) метода get_directory
в классе Video
не изменит свойства upload_to
атрибута file
модели.
Обновление
В документации говорится, что upload_to
может быть вызвано.
Это также может вызываться, например, функция, которая будет вызываться для получения пути загрузки, включая имя файла.Этот вызываемый объект должен иметь возможность принимать два аргумента и возвращать путь в стиле Unix (с косой чертой) для передачи в систему хранения.
Учитывая это, мы можем написать пользовательскую функцию обратного вызова, например:
categories_and_paths = { 'video': 'videos/', 'photo': 'photos/' } # etc.
def get_directory(instance, filename):
category = instance.category
return categories_and_paths.get(category, '')
Instance
здесь будет экземпляр соответствующей модели.Чтобы это работало, каждый экземпляр модели должен иметь поле категории.Мы можем добавить один в теле модели.
class Video(UploadItem):
category = 'video'