Поле FilePathField

Поле FilePathField в Django представляет собой поле формы, которое позволяет пользователю выбрать файл из определенной директории на сервере. В отличие от FileField, которое загружает новый файл, FilePathField предлагает выбор из уже существующих файлов. Поле принимает такие параметры как 'path' - обязательный путь к директории, 'match' - регулярное выражение для фильтрации файлов, 'recursive' - разрешает поиск в поддиректориях и другие.

Синтаксис

pythonfrom django import forms

class YourForm(forms.Form):
  file = forms.FilePathField(path='/path/to/directory/', **options)

Основные параметры

Поле FilePathField принимает следующие ключевые параметры:

pythonfrom django import forms

class DocumentForm(forms.Form):
  document = forms.FilePathField(
    path='/home/user/documents/',
    recursive=True,
    match=r'\.txt$',
    allow_files=True,
    allow_folders=False,
    required=False
  )

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

Создадим форму для выбора конфигурационного файла из директории '/etc/myapp/':

pythonfrom django import forms

class ConfigForm(forms.Form):
  config_file = forms.FilePathField(
    path='/etc/myapp/',
    match=r'\.conf$',
    recursive=False,
    label='Configuration file',
    help_text='Select a .conf file from the config directory'
  )

Пример . Обработка данных формы

Рассмотрим, как обработать данные из формы с FilePathField во view:

pythonfrom django.shortcuts import render
from .forms import ConfigForm

def select_config(request):
  res = None

  if request.method == 'POST':
    form = ConfigForm(request.POST)

    if form.is_valid():
      selected_file = form.cleaned_data['config_file']
      res = f"Selected file: {selected_file}"

  else:
    form = ConfigForm()

  return render(request, 'config.html', {'form': form, 'result': res})

Результат при успешной отправке формы:

python"Selected file: /etc/myapp/settings.conf"

Пример . С фильтрацией по расширению

Используем параметр match для отображения только изображений в формате 'png' или 'jpg':

pythonfrom django import forms

class ImageSelectForm(forms.Form):
  image = forms.FilePathField(
    path='/media/images/',
    match=r'\.(png|jpg|jpeg)$',
    recursive=True,
    label='Select an image'
  )

Пример . С разрешением выбора папок

Разрешим пользователю выбирать как файлы, так и папки, установив параметры allow_files и allow_folders:

pythonfrom django import forms

class FolderSelectForm(forms.Form):
  path = forms.FilePathField(
    path='/home/user/projects/',
    allow_files=False,
    allow_folders=True,
    recursive=True,
    label='Select project folder'
  )

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

Поле FilePathField также можно использовать в моделях Django:

pythonfrom django.db import models

class Theme(models.Model):
  name = models.CharField(max_length=100)
  template_file = models.FilePathField(
    path='/templates/themes/',
    match=r'\.html$',
    recursive=True
  )

  def __str__(self):
    return self.name

Смотрите также

  • поле FileField,
    которое используется для загрузки файлов на сервер
  • поле ImageField,
    которое предназначено для загрузки изображений
  • поле ChoiceField,
    которое предоставляет выбор из заранее заданных вариантов
  • поле ModelChoiceField,
    которое позволяет выбирать объекты из модели базы данных