Django Academy · Урок

MEDIA_ROOT и загрузка файлов

Принимайте и храните файлы, загруженные пользователями

Урок 3 из 413 шагов

«MEDIA_ROOT и загрузка файлов» — бесплатный урок Django Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Django Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Django Academy содержит 4 уроков всего.

Статические файлы и медиафайлы

Статические файлы поставляются вместе с кодом. Медиафайлы загружаются пользователями во время работы приложения — например, аватары или документы — и требуют отдельного места хранения.

Настройка MEDIA_ROOT

MEDIA_ROOT — это абсолютная папка на диске, куда Django сохраняет все загруженные файлы. Она находится за пределами дерева исходного кода.

MEDIA_ROOT = BASE_DIR / 'media'

Настройка MEDIA_URL

MEDIA_URL — это общедоступный префикс, по которому браузеры запрашивают загруженный файл, подобно тому как STATIC_URL используется для статических ресурсов.

MEDIA_URL = '/media/'

Добавление FileField

Чтобы принимать загрузки, добавьте модели поле FileField. Django сохранит файл на диске, а в базе данных оставит только его путь.

class Resume(models.Model):
    doc = models.FileField(upload_to='resumes/')

Путь upload_to

Аргумент upload_to задаёт вложенную папку внутри MEDIA_ROOT. Используйте его для упорядочивания загрузок, например чтобы хранить все резюме вместе.

Динамический upload_to

Передайте в upload_to функцию, если путь должен зависеть от экземпляра, например чтобы распределять файлы по пользователям.

def user_dir(instance, filename):
    return f'user_{instance.user.id}/{filename}'

Формам нужен enctype

HTML-форма, загружающая файлы, должна установить для enctype значение multipart/form-data, иначе браузер вообще не отправит содержимое файлов.

<form method="post" enctype="multipart/form-data">

Чтение request.FILES

Содержимое загруженных файлов не попадает в request.POST. Оно оказывается в request.FILES, который нужно передать форме для привязки файлов.

form = ResumeForm(request.POST, request.FILES)

Получение URL

После сохранения каждое поле файла предоставляет свойство .url, создающее ссылку MEDIA_URL, которую можно вставить в шаблон.

<a href="{{ resume.doc.url }}">Download</a>

Проверка загрузок

Никогда не доверяйте необработанным загрузкам. Ограничивайте размер и тип файла в методе clean формы, чтобы не пропускать вредоносные файлы. 🔒

Храните медиафайлы отдельно

MEDIA_ROOT должен находиться за пределами репозитория и никогда не обслуживаться collectstatic. Пользовательские файлы и код должны оставаться явно разделёнными.

Быстрая проверка

Проверим, куда поступают данные загруженного файла в представлении.

Итоги

Вы узнали, что MEDIA_ROOT хранит пользовательские загрузки, что FileField вместе с upload_to помогает их организовать, а request.FILES содержит содержимое файлов. 📁

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «MEDIA_ROOT и загрузка файлов» бесплатный?

Да — полный текст урока «MEDIA_ROOT и загрузка файлов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Django Academy, подпишись на CoddyKit PRO. Курс Django Academy содержит 4 уроков всего.

Чему я научусь в уроке «MEDIA_ROOT и загрузка файлов»?

Принимайте и храните файлы, загруженные пользователями Ты практикуешь Django Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Django Academy?

Предыдущий опыт не требуется. Django Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «MEDIA_ROOT и загрузка файлов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Django Academy?

Да. Каждый урок Django Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. STATICFILES и статический тег
  2. collectstatic для рабочего окружения
  3. MEDIA_ROOT и загрузка файлов
  4. ImageField и выдача загруженных файлов
← Назад к Django Academy