Django, сохраняем файл и рассчитываем его размер
Доброго времени суток!
В Django очень просто организовать загрузку файлов, но к сожалению в БД записывается исключительно ссылка на файл. Что делать, если нам нужна дополнительная информация: размер файла, тип файла, итп…
Разберёмся…
Всё началось с того, что дизайнер нарисовал следующее:
Сейчас расскажу как с этой задачей справился я, надеюсь моё решение поможет ещё кому.
Как видно на рисунке, нам нужна модель со следующими полями: «название», «собственно сам файл», «размер файла». Создаём модель:
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 (которое будет хранить размер файла) нередактируемо(!), пользователь не будет его видеть в админке, а заполняться оно будет автоматически. Собственно переходим к сохранению:
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() в данном случае работала корректно, добавьте в начало файла ещё:
import os, settings
Ещё маленькое добавление. Для корректного вывода рекомендую использовать следующее написание:
{{ price.filesize|filesizeformat }}
Таким образом размер файла у Вас всегда будет в удобочитаемой форме (Пример: 1,7 Мб, 206 Кб, итп…)