Django — поле файла динамически устанавливает upload_to

#python #django

#python #django

Вопрос:

Например, я должен использовать приложения django

 - project
-- photo 
-- attachments
  

И я создаю модель, в которой я храню свои tmp-файлы

 # python 3.4
class UploadedFiles(models.Model):
    file = models.FileField(upload_to='photo/%Y/%m/%d')
  

Но я хочу использовать эту таблицу для всех загружаемых файлов и динамически изменять upload_to .

Я подумал об этом и написал это

 # python 3.4
def get_path(instance, filename):
    filename, file_ext = os.path.splitext(filename)

    return instance.path.format(filename, file_ext)


class UploadedFiles(models.Model):
    path = models.CharField(max_length=100)
    file = models.FileField(upload_to=get_path, blank=True)
  

Итак, сначала я создаю новую запись

 # python 3.4
uf = UploadedFiles.path = 'attachments/%Y/%m/%d/{0}.blabla.{1}'
uf.save()
  

При следующем сохранении файла

 uf.file = file
uf.save()
  

ОК. Это работает, но выглядит очень плохо. Как я могу сделать это нормально?

Спасибо!

Ответ №1:

Вы имеете в виду это?

 from django.core.files import File, ContentFile

uf = UploadedFiles(path='...', file=File(fp))
# Or
uf = UploadedFiles(path='...', file=ContentFile(file_content))
uf.save()
  

Кроме того, '%Y' не работает, если вы укажете upload_to как функцию, если я правильно помню.

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

1. Я хочу загрузить файл с моим, upload_to не создавая path .

2. @AlexanderKiselev Ты имеешь в виду присвоение path значения по умолчанию: path = models.CharField(max_length=100, default='attachments/...') ?

3. Нет… Например, у меня есть таблица, в которой я храню все свои файлы. Я хочу хранить файлы в разных папках, я хочу задать upload_to параметр динамически, как в примере, но без path метода в моей модели.

4. @AlexKiselev Извините, я не понимаю. Но вы должны реализовать upload_to для динамической генерации путей.