Загрузка файла после сохранения модели в Django admin

#django #file-upload #django-admin

#django #загрузка файла #django-admin

Вопрос:

Я использую загрузку файлов в моей модели Django следующим образом :

  def upload_path(self, filename):
    return 'upload/actualities/%s/%s' % (self.id, filename)

photo = models.ImageField(upload_to=upload_path)
  

и моя adminModel :

 from actualities.models import *
from django.contrib import admin  

class ActualityAdmin(admin.ModelAdmin):
     class Media:
         js = ('/static/js/tiny_mce/tiny_mce.js', '/static/js/textareas.js')

 admin.site.register(Actuality, ActualityAdmin)
  

Все работает нормально, за исключением случаев, когда я редактирую модель mu, потому что у нее есть идентификатор. Но когда я его создаю, загрузка файла происходит до сохранения модели… Итак, я поместил свой файл в /media/actualities/None/filename.jpg , и я хочу /media/2/filename.jpg

Как я могу принудительно выполнить загрузку файла после сохранения модели?

Спасибо!!!

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

1. Не уверен, возможно ли это вообще: сгенерированное имя файла сохраняется в вашем экземпляре, поэтому, если вы принудительно сохраните его раньше, вам придется снова сохранить экземпляр с новым именем файла.

Ответ №1:

Вероятно, вы захотите переопределить метод save() модели и, возможно, создать пользовательский UploadHandler «ничего не делать», затем вернуться к исходному и снова вызвать save .

https://docs.djangoproject.com/en/dev/topics/http/file-uploads/

https://docs.djangoproject.com/en/dev/topics/db/models/

Однако в этой ситуации я бы сделал пользовательский обработчик загрузки, который сохраняет файл в некотором временном пространстве. Затем я бы переопределил метод сохранения (в микшировании или что-то в этом роде), который перемещает файл из temp туда, куда вы хотели.

ответ @Tomek — это тоже другой способ. Если ваша модель генерирует свой собственный идентификатор, вы можете использовать это.

Предпоследнее предложение, которое я делаю в своем фотоблоге, — это вместо сохранения всех изображений в каталоге, например media/2/filename.jpg Я сохраняю изображение по дате загрузки. 2011/10/2/image.jpg Это как бы помогает любому каталогу не стать слишком громоздким.

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

Я выбрал стиль даты, потому что это имеет значение для меня в этом проекте. Возможно, есть другой способ, которым вы можете назвать изображение для сохранения, которое означало бы нечто большее, чем «модель с фотографиями id 2», которую вы могли бы использовать для решения этой проблемы.

Удачи!

Ответ №2:

В качестве обходного пути попробуйте сгенерировать UUID для имени файла (вместо использования self.id ).

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

1. Это решение, но я думаю, что, возможно, проще указать идентификатор пользователя для имени папки. Я буду использовать ваше решение, если не найду свой путь. Большое спасибо!

2. Это решение хорошее, но это означает, что ваша папка загрузки не очень организована…