Django, сохраняем файл и рассчитываем его размер
Доброго времени суток!
В Django очень просто организовать загрузку файлов, но к сожалению в БД записывается исключительно ссылка на файл. Что делать, если нам нужна дополнительная информация: размер файла, тип файла, итп…
Разберёмся…
Всё началось с того, что дизайнер нарисовал следующее:
Сейчас расскажу как с этой задачей справился я, надеюсь моё решение поможет ещё кому.
Как видно на рисунке, нам нужна модель со следующими полями: «название», «собственно сам файл», «размер файла». Создаём модель:
1 2 3 4 | class Prices(models.Model): title = models.CharField(verbose_name = "Название" , max_length = 100 ) file = models.FileField(verbose_name = "Прайс" , help_text = "Файл для загрузки" , upload_to = 'prices/' ) filesize = models.CharField(editable = False , max_length = 100 ) |
Обратите внимание, что поле filesize (которое будет хранить размер файла) нередактируемо(!), пользователь не будет его видеть в админке, а заполняться оно будет автоматически. Собственно переходим к сохранению:
1 2 3 4 5 | def save( self ): super (Prices, self ).save() fullpath = os.path.join(settings.MEDIA_ROOT, self . file .field.upload_to, self . file .path) self .filesize = os.path.getsize(fullpath) super (Prices, self ).save() |
Объясню поподробнее. Это функция сохранения для данной модели.
1ая строка = сохраняем (т.е. пользователь заполнил поле «Название», выбрал файл и нажал «Сохранить»). Это нужно нам для того, чтобы файл физически появился на сервере.
2ая строка = для удобства заводим переменную fullpath, ей присваивается полный путь до файла
3ая строка = вычисляем размер файла и записываем его в поле filesize
4ая строка = сохраняем ещё раз модель, теперь уже с «размером файла»
Чтобы функция save() в данном случае работала корректно, добавьте в начало файла ещё:
1 | import os, settings |
Ещё маленькое добавление. Для корректного вывода рекомендую использовать следующее написание:
1 | {{ price.filesize|filesizeformat }} |
Таким образом размер файла у Вас всегда будет в удобочитаемой форме (Пример: 1,7 Мб, 206 Кб, итп…)