Поле FileField
Поле FileField в формах Django предназначено для приема файлов, отправленных пользователем через веб-форму. Оно представляет собой поле ввода с типом file в HTML и автоматически обрабатывает загруженные данные. Для работы с этим полем необходимо, чтобы форма имела атрибут enctype="multipart/form-data". Поле может принимать параметры валидации, такие как max_length для ограничения имени файла и allow_empty_file для разрешения или запрета пустых файлов.
Синтаксис
from django import forms
class MyForm(forms.Form):
file = forms.FileField(**options)
Пример
Давайте создадим форму для загрузки файла с валидацией расширения:
from django import forms
from django.core.validators import FileExtensionValidator
class UploadForm(forms.Form):
document = forms.FileField(
label="Choose a file",
validators=[FileExtensionValidator(allowed_extensions=['pdf', 'docx'])]
)
Результат выполнения кода:
"<input type="file" name="document" id="id_document">"
Пример
Давайте обработаем загруженный файл в представлении:
from django.shortcuts import render
from .forms import UploadForm
from django.core.files.storage import default_storage
def upload_view(request):
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
uploaded_file = request.FILES['document']
file_path = default_storage.save(uploaded_file.name, uploaded_file)
res = f"File saved to {file_path}"
return render(request, 'success.html', {'message': res})
else:
form = UploadForm()
return render(request, 'upload.html', {'form': form})
Пример
Давайте используем FileField в модели и создадим форму на основе модели:
from django.db import models
from django import forms
class Document(models.Model):
title = models.CharField(max_length=100)
file = models.FileField(upload_to='documents/')
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = ['title', 'file']
Результат выполнения кода:
"<input type="file" name="file" id="id_file">"
Пример
Давайте проверим, загружен ли файл и получим его размер:
from django import forms
class FileCheckForm(forms.Form):
file = forms.FileField()
def check_file(request):
if request.method == 'POST':
form = FileCheckForm(request.POST, request.FILES)
if form.is_valid():
file_obj = request.FILES['file']
if file_obj:
res = f"File size: {file_obj.size} bytes"
return render(request, 'result.html', {'result': res})
else:
form = FileCheckForm()
return render(request, 'check.html', {'form': form})
Смотрите также
-
поле
ImageField,
которое специализируется на загрузке изображений -
поле
FilePathField,
которое предоставляет выбор файлов из директории -
виджет
FileInput,
который рендерит HTML-поле для загрузки файлов -
виджет
ClearableFileInput,
который добавляет возможность очистить загруженный файл