Django, сохраняем файл и рассчитываем его размер

9 сентября 2010 г.

Доброго времени суток!

В 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 Кб, итп…)

Теги:
рубрика Python, Сайтостроение