Статичные файлы
Пришло время ближе познакомиться со статическими файлами. Статическими файлами называются все файлы каскадных таблиц стилей (Cascading Style Sheets, CSS), изображений, а также скриптов JavaScript, - т. е. файлы, которые не изменяются динамически и содержание которых не зависит от контекста запроса и одинаково для всех пользователей. Также в качестве статичных файлов не редко используют HTML файлы, такие как шапка сайта, футер, и другие.
При создании проекта Django он уже имеет некоторую базовую настройку для работы со статическими файлами.
В частности, в файле settings.py определена переменная STATIC_URL, которая хранит путь к каталогу со статическими файлами:
STATIC_URL = 'static/'
А среди установленных приложений в переменной INSTALLED_APPS указано приложение django.contrib.staticfiles:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog'
]
Чтобы использовать статичные файлы в шаблоне, для этого в начале файла шаблона необходимо добавить:
{% load static %}
При этом данный код должен идти вверху нашего шаблона, перед <!DOCTYPE html> тегом.
Для определения пути к статическим файлам используются выражения такого типа:
{% static "путь к файлу внутри папки static" %}
Создадим папку static в папке приложения blog. Внутри еще одну папку images, и добавим туда изображение. В результате получится следующая структура:
И вот так это используется в шаблоне:
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Учу Django</title>
</head>
<body>
<h1>Логотип Django</h1>
<img src="{% static 'images/django_logo.png' %}" width="300px">
</body>
</html>
И если мы откроем наш сайт, то увидим следующее:
Настройка путей к файлам
Если нас не устраивает хранение файлов в каталоге по умолчанию - каталоге static приложения, либо мы хотим указать несколько папок, то мы можем в файле settings.py задать все необходимые каталоги с помощью переменной STATICFILES_DIRS, которая принимает список путей:
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
"/somefolder/"
]
TemplateView
В предыдущих разделах, когда приходил запрос, система маршрутизации выбирала нужное представление, и то уже в свою очередь использовало шаблон для генерации ответа. Но в принципе если в ответ на запрос нам просто надо возвратить пользователю содержимое шаблона, то для этого необязательно определять функцию-представления.
Можно воспользоваться встроенным классом TemplateView:
from django.urls import path
from django.views.generic import TemplateView
from blog import views
urlpatterns = [
path('', views.index),
path('about/', TemplateView.as_view(template_name="blog/about.html")),
path('contact/',TemplateView.as_view(template_name="blog/contact.html")),
]
То есть в данном случае за вызов шаблона главной страницы у нас будет отвечать функция views.index в views.py, а шаблоны разделов about и contact мы определили в самом файле urls.py.
Стоит отметить, что в пути к шаблону страницы также может указываться и папка, в которой он находится. В нашем случае шаблоны находятся в корне папки templates. Например если наш шаблон находится в папке templates/blog/about.html, то и путь мы должны указать как blog/about.html.
Также с помощью параметра extra_context в метод as_view можно передать данные для их отображения в шаблоне. Данные должны представлять собой словарь. В качестве примера передадим в шаблон about.html виды работ, которые выполняет компания.
Для этого используем переменную header и следующим образом изменим код файла urls.py:
from django.urls import path
from django.views.generic import TemplateView
from blog import views
urlpatterns = [
path('', views.index),
path("about/", TemplateView.as_view(template_name="blog/about.html", extra_context={"header": "О сайте"})),
path('contact/', TemplateView.as_view(template_name="blog/contact.html")),
]
Теперь мы можем добавить в наш шаблон переменную {{ header }} что выведет её содержимое. Создадим файл about.html в папке templates/blog/ следующего содержания:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Учу Django</title>
</head>
<body>
<h1>{{ header }}</h1>
</body>
</html>
Теперь перейдем по адресу http://127.0.0.1:8000/about/, и мы увидим что данные передались: