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 вашого застосунку.

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

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ