Поле FileField
Поле FileField в Django предназначено для хранения файлов, загружаемых через формы или создаваемых программно. Оно хранит в базе данных строку с путем к файлу относительно корня медиа-директории, а сам файл сохраняется в файловой системе или облачном хранилище. Поле принимает обязательный параметр upload_to, который определяет директорию для сохранения загружаемых файлов. Это может быть как строка с путем, так и функция, генерирующая динамическое имя файла на основе экземпляра модели и имени исходного файла.
Параметры
Основные параметры поля FileField:
FileField(
upload_to='uploads/',
storage=None,
max_length=100,
blank=False,
null=False,
unique=False,
db_index=False,
default='',
validators=[],
error_messages=None,
help_text='',
verbose_name='',
)
Параметр upload_to определяет путь внутри директории MEDIA_ROOT, куда будут сохраняться загруженные файлы. Параметр storage позволяет указать пользовательскую систему хранения файлов. Параметр max_length задает максимальную длину строки с путем к файлу в базе данных, по умолчанию 100 символов.
Синтаксис объявления в модели
from django.db import models
class Document(models.Model):
title = models.CharField(max_length=200)
file = models.FileField(upload_to='documents/')
Пример
Объявим модель для хранения загружаемых пользователями документов:
from django.db import models
class UploadedFile(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(blank=True)
file = models.FileField(upload_to='uploads/')
uploaded_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
Пример
Создадим экземпляр модели с загруженным файлом:
from myapp.models import UploadedFile
from django.core.files import File
# Creating instance with file
doc = UploadedFile(
name='Report',
description='Annual financial report'
)
# Save file (assuming file is opened)
with open('/path/to/report.pdf', 'rb') as f:
doc.file.save('report.pdf', File(f))
doc.save()
Пример
Получим доступ к загруженному файлу из модели:
from myapp.models import UploadedFile
# Get document
doc = UploadedFile.objects.get(name='Report')
# Access file properties
print(f"File path: {doc.file.path}")
print(f"File URL: {doc.file.url}")
print(f"File name: {doc.file.name}")
print(f"File size: {doc.file.size} bytes")
Результат выполнения кода:
"File path: /media/uploads/report.pdf"
"File URL: /media/uploads/report.pdf"
"File name: report.pdf"
"File size: 102400 bytes"
Пример
Используем динамическую генерацию пути с помощью функции:
from django.db import models
import os
def user_directory_path(instance, filename):
# File will be uploaded to MEDIA_ROOT/user_<id>/<filename>
return f'user_{instance.user.id}/{filename}'
class UserFile(models.Model):
user = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length=100)
file = models.FileField(upload_to=user_directory_path)
def __str__(self):
return self.title
Пример
Проверим существование файла и удалим его:
from myapp.models import UploadedFile
# Get document
doc = UploadedFile.objects.get(name='Report')
# Check if file exists
if doc.file:
print("File exists")
# Delete file from filesystem
doc.file.delete(save=True)
print("File deleted")
Результат выполнения кода:
"File exists"
"File deleted"
Смотрите также
-
поле
ImageField,
которое является специализацией для изображений -
поле
FilePathField,
которое хранит путь к файлу в файловой системе -
поле
BinaryField,
которое хранит бинарные данные в базе данных -
метод
save,
который сохраняет экземпляр модели с файлом