Виджет FileInput

Виджет FileInput в Django используется для отображения поля ввода файлов в HTML-формах. Он генерирует элемент <input type="file">, который позволяет пользователям выбирать файлы с локального компьютера для загрузки на сервер. Виджет автоматически обрабатывает отправку файлов через формы с атрибутом enctype="multipart/form-data". Основной параметр виджета - это атрибуты HTML-элемента, которые можно передать через аргумент attrs.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  file_field = forms.FileField(widget=forms.FileInput(attrs={'class': 'my-class'}))

Пример . Базовое использование

Создадим простую форму для загрузки файлов с использованием виджета FileInput:

pythonfrom 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'})
  )

Пример . Обработка загруженного файла

Рассмотрим полный пример обработки формы с файлом в представлении:

pythonfrom 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-элемента для улучшения пользовательского опыта:

pythonfrom 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 в формах на основе моделей:

pythonfrom 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})

Пример . Множественная загрузка

Настройка виджета для загрузки нескольких файлов одновременно:

pythonfrom 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,
    который создает чекбокс для формы