JavaRush /Курсы /Модуль 3: Django /Работа со статическими файлами (CSS, JS)

Работа со статическими файлами (CSS, JS)

Модуль 3: Django
5 уровень , 5 лекция
Открыта

Вы уже настроили свои шаблоны и начали внедрять динамический HTML-контент в свои проекты. Но как насчёт того, чтобы добавить немного стиля и оживить наши страницы? Именно для этого на сцену выходят статические файлы — CSS, JavaScript, изображения и даже шрифты.

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

Да, структуру тоже обсудим — никуда без неё!

Что такое статические файлы и зачем они нужны?

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

  • CSS-файлы, чтобы ваши элементы выглядели красиво (или хотя бы пытались).
  • JavaScript-файлы для интерактивности, например, для обработки всплывающих окон или валидации форм.
  • Изображения, которые порадуют глаз пользователя и украсят ваш сайт.
  • Шрифты, звуки и прочее.

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

Где хранятся статические файлы в Django?

Django ожидает, что ваши статические файлы будут лежать в определённых директориях. Давайте разберёмся, как и где их хранить.

Папка для статических файлов

Для статических файлов принято использовать папку static. Она может располагаться:

  • В папке вашего приложения, например: myapp/static/.
  • В отдельной глобальной директории, указанной в настройках проекта.

Давайте создадим структуру файлов:

project_name/
|-- myapp/
|   |-- static/
|       |-- css/
|       |   |-- styles.css
|       |-- js/
|           |-- scripts.js
|-- static/
|   |-- css/
|   |-- js/
|   |-- images/

Названия, такие как css, js, images, не обязательны, но они помогают держать файлы упорядоченными.

Настройка статических файлов в проекте

Для начала нам нужно убедиться, что наш проект знает, где искать статические файлы. Все настройки находятся в файле settings.py.

Базовые настройки:

  1. Указать STATIC_URL:

В settings.py:

STATIC_URL = '/static/'

Эта настройка определяет URL, по которому статические файлы будут доступны на сайте. Например, /static/css/styles.css.

  1. Добавить директорию для статических файлов:

Если вы хотите использовать глобальную папку static для всего проекта, добавьте её в STATICFILES_DIRS:

STATICFILES_DIRS = [
    BASE_DIR / "static",
]

Эта настройка сообщает Django, где искать дополнительные статические файлы в вашем проекте.

  1. Папка для собранных файлов (на продакшене):

На этапе разработки ничего не нужно делать, но для продакшена следует указать STATIC_ROOT, куда Django соберёт все статические файлы:

STATIC_ROOT = BASE_DIR / "staticfiles"

Эта папка затем используется для раздачи файлов через веб-сервер, например, Nginx или Apache.

Подключение CSS в шаблоны

CSS отвечает за стиль страниц. Для подключения CSS к шаблону необходимо использовать специальный тег {% static %}. Этот тег автоматически подставит правильный путь для статических файлов.

Пример:

Создайте файл styles.css в папке myapp/static/css/ со следующим содержимым:

body {
    background-color: #f5f5f5;
    font-family: Arial, sans-serif;
    color: #333;
}

h1 {
    color: #007bff;
}

Теперь подключите этот файл в шаблоне:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Моя стильная страница</title>
    <!-- Подключаем CSS -->
    {% load static %}
    <link rel="stylesheet" type="text/css" href="{% static 'css/styles.css' %}">
</head>
<body>
    <h1>Привет, мир!</h1>
</body>
</html>

Что здесь происходит?

  1. {% load static %} — команда для загрузки тега {% static %}, необходимого для работы со статическими файлами.
  2. {% static 'css/styles.css' %} — формирует правильный путь к файлу styles.css.

Откройте браузер, обновите страницу и наслаждайтесь серым фоном и синим заголовком.

Подключение JavaScript

JavaScript (JS) добавляет интерактивность. Создадим файл scripts.js в папке myapp/static/js/:

// scripts.js
document.addEventListener('DOMContentLoaded', () => {
    alert('Страница загружена!');
});

Теперь подключите этот скрипт в шаблон:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Страница с интерактивом</title>
    {% load static %}
    <link rel="stylesheet" type="text/css" href="{% static 'css/styles.css' %}">
</head>
<body>
    <h1>Привет, мир!</h1>
    <script src="{% static 'js/scripts.js' %}"></script>
</body>
</html>

Как только вы обновите страницу, браузер покажет всплывающее сообщение "Страница загружена!".

Работает ли это на продакшене?

На этапе разработки Django обслуживает статические файлы прямо из папки проекта. Однако на продакшене Django этим не занимается. Вам нужно собрать все файлы в одну папку (используя команду collectstatic) и настроить сервер (например, Nginx) для их раздачи.

Команда collectstatic:

python manage.py collectstatic

Эта команда соберёт все статические файлы из STATICFILES_DIRS и приложений в одну папку STATIC_ROOT.

Если вы используете Nginx, настройка примерно такая:

location /static/ {
    alias /path/to/your/project/staticfiles/;
}

Общие ошибки и их устранение

  1. Забыл {% load static %} в шаблоне. Это приводит к ошибке Invalid block tag: 'static'. Добавьте выгрузку блока в начало файла.

  2. Статические файлы не отображаются: Убедитесь, что STATIC_URL и пути к файлам настроены правильно. На продакшене проверьте работу сервера (например, Nginx).

  3. 404 Not Found для CSS/JS: Это часто происходит, если файл находится не в папке static приложения или путь в шаблоне указан с ошибкой.

Практическое задание

  1. Создайте CSS-файл, который изменяет цвет заголовков на красный.
  2. Добавьте JS-функцию, которая изменяет текст заголовка при нажатии на него.
  3. Организуйте CSS и JS файлы в папке static своего приложения.

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

1
Задача
Модуль 3: Django, 5 уровень, 5 лекция
Недоступна
Подключение CSS
Подключение CSS
1
Задача
Модуль 3: Django, 5 уровень, 5 лекция
Недоступна
Подключение JavaScript
Подключение JavaScript
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Максим Уровень 69
30 октября 2025
2я Задача, при проверке валидатор выдает ошибку. - "Браузер не должен использовать закэшированный JavaScript-файл."Решение №1: "Versioning" — добавление хеша или параметра Простейший и самый надёжный способ: добавить к URL параметр версии, например `?v=123`. Пример в Django-шаблоне:

<script src="{% static 'js/main.js' %}?v={{ STATIC_VERSION }}"></script>
А в `settings.py` можно задать:

STATIC_VERSION = '1.0.5'
И менять номер версии, когда обновляешь статику. (Можно даже генерировать автоматически при деплое.) ✅ Решение №2: `ManifestStaticFilesStorage` В production-окружении Django рекомендует использовать:

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
Что это даёт: - Django при сборке (`collectstatic`) добавит хеш в имя каждого файла, например:

main.js → main.4f9d8a3d.js
- Шаблон `{% static 'js/main.js' %}` автоматически подставит актуальное имя с хешем. ✅ Решение №3: Заголовки Cache-Control Если тебе нужно временно отключить кеширование (например, в dev-режиме): в `settings.py` можно добавить middleware, которое задаёт заголовки:

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse

class NoCacheMiddleware(MiddlewareMixin):
    def process_response(self, request, response: HttpResponse):
        response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
        response['Pragma'] = 'no-cache'
        response['Expires'] = '0'
        return response
И подключить в `MIDDLEWARE`.