Виджет FileInput
Виджет FileInput в Django используется для отображения
поля ввода файлов в HTML-формах. Он генерирует элемент
<input type="file">, который позволяет пользователям
выбирать файлы с локального компьютера для загрузки на сервер.
Виджет автоматически обрабатывает отправку файлов через
формы с атрибутом enctype="multipart/form-data".
Основной параметр виджета - это атрибуты HTML-элемента,
которые можно передать через аргумент attrs.
Синтаксис
from django import forms
class MyForm(forms.Form):
file_field = forms.FileField(widget=forms.FileInput(attrs={'class': 'my-class'}))
Пример . Базовое использование
Создадим простую форму для загрузки файлов с использованием
виджета FileInput:
from django import forms
class UploadForm(forms.Form):
file = forms.FileField(
label='Выберите файл',
widget=forms.FileInput(attrs={
'class': 'form-control',
'accept': '.pdf,.doc,.docx'
})
)
description = forms.CharField(
max_length=200,
required=False,
widget=forms.TextInput(attrs={'class': 'form-control'})
)
Пример . Обработка загруженного файла
Рассмотрим полный пример обработки формы с файлом в представлении:
from django.shortcuts import render
from django.http import HttpResponse
from django import forms
class UploadForm(forms.Form):
file = forms.FileField(widget=forms.FileInput)
def upload_file(request):
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
file = request.FILES['file']
# Обработка файла
file_name = file.name
file_size = file.size
content = file.read()
return HttpResponse(f"File: {file_name}, Size: {file_size}")
else:
form = UploadForm()
return render(request, 'upload.html', {'form': form})
Пример . Настройка атрибутов
Виджет FileInput позволяет настроить различные
атрибуты HTML-элемента для улучшения пользовательского
опыта:
from django import forms
class DocumentForm(forms.Form):
document = forms.FileField(
widget=forms.FileInput(attrs={
'class': 'file-input',
'id': 'doc-upload',
'accept': '.pdf,.txt,.md',
'multiple': 'multiple',
'required': 'required'
})
)
# Использование в шаблоне
form = DocumentForm()
# {{ form.document }} выведет:
# <input type="file" name="document" class="file-input"
# id="doc-upload" accept=".pdf,.txt,.md"
# multiple="multiple" required="required">
Пример . Работа с моделями
Использование виджета FileInput в формах
на основе моделей:
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/')
created_at = models.DateTimeField(auto_now_add=True)
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = ['title', 'file']
widgets = {
'file': forms.FileInput(attrs={
'class': 'form-control-file',
'accept': '.pdf,.doc,.docx'
}),
}
# В представлении
def upload_document(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
document = form.save()
return HttpResponse(f"Document saved: {document.title}")
else:
form = DocumentForm()
return render(request, 'upload_doc.html', {'form': form})
Пример . Множественная загрузка
Настройка виджета для загрузки нескольких файлов одновременно:
from django import forms
class MultipleUploadForm(forms.Form):
files = forms.FileField(
widget=forms.FileInput(attrs={'multiple': 'multiple'}),
label='Выберите несколько файлов'
)
# В представлении
def upload_multiple(request):
if request.method == 'POST':
form = MultipleUploadForm(request.POST, request.FILES)
if form.is_valid():
files = request.FILES.getlist('files')
file_names = [f.name for f in files]
message = f"Uploaded files: {', '.join(file_names)}"
return HttpResponse(message)
else:
form = MultipleUploadForm()
return render(request, 'upload_multiple.html', {'form': form})
Смотрите также
-
виджет
ClearableFileInput,
который добавляет чекбокс для очистки поля файла -
виджет
TextInput,
который создает текстовое поле ввода -
виджет
PasswordInput,
который создает поле для ввода пароля -
виджет
CheckboxInput,
который создает чекбокс для формы