#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. Это решение хорошее, но это означает, что ваша папка загрузки не очень организована…