Search
Write a publication
Pull to refresh

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

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

В Django очень просто организовать загрузку файлов, но к сожалению в БД записывается исключительно ссылка на файл. Что делать, если нам нужна дополнительная информация: размер файла, тип файла, итп…

Разберёмся…

Всё началось с того, что дизайнер нарисовал следующее:

image

Сейчас расскажу как с этой задачей справился я, надеюсь моё решение поможет ещё кому.
Как видно на рисунке, нам нужна модель со следующими полями: «название», «собственно сам файл», «размер файла». Создаём модель:

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

Удачи!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.