Поле FileField

Поле FileField в формах Django предназначено для приема файлов, отправленных пользователем через веб-форму. Оно представляет собой поле ввода с типом file в HTML и автоматически обрабатывает загруженные данные. Для работы с этим полем необходимо, чтобы форма имела атрибут enctype="multipart/form-data". Поле может принимать параметры валидации, такие как max_length для ограничения имени файла и allow_empty_file для разрешения или запрета пустых файлов.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  file = forms.FileField(**options)

Пример

Давайте создадим форму для загрузки файла с валидацией расширения:

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

Результат выполнения кода:

python"<input type="file" name="document" id="id_document">"

Пример

Давайте обработаем загруженный файл в представлении:

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

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/')

class DocumentForm(forms.ModelForm):
  class Meta:
    model = Document
    fields = ['title', 'file']

Результат выполнения кода:

python"<input type="file" name="file" id="id_file">"

Пример

Давайте проверим, загружен ли файл и получим его размер:

pythonfrom 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,
    который добавляет возможность очистить загруженный файл