Переопределение из каталога шаблонов приложения django python

На чтение
12 мин
Дата обновления
22.06.2025
#COURSE#

Для переопределения шаблона в Django, необходимо понимать структуру вашего проекта. Во-первых, найдите шаблон, который вы хотите переопределить, в каталоге вашего приложения. Затем, создайте в том же приложении подкаталог templates (если его нет), и поместите в него новый файл с тем же названием, что и исходный шаблон, но с изменением расширения с .html на .html. Например, из файла base.html в каталоге приложения создайте новый base.html в подкаталоге templates.

Важно: путь к новому шаблону будет относительным. Django ищет шаблоны именно в расположении вашего приложения по аналогии с тем, как искать файл .js или .css в своих директориях.

Обратите внимание на пути: Django автоматически обращается к шаблонам в подкаталоге templates внутри вашего приложения. Убедитесь, что шаблон с вашей заменой находится именно по этому пути и имеет соответствующее название. Поэкспериментируйте с разными названиями шаблонов, если у вас возникли проблемы.

Пример: если ваш шаблон находится в my_app/templates/my_app/base.html, то Django будет искать подходящий шаблон для переопределения именно в подкаталоге my_app/templates/. Изменения валидны только если этот подкаталог создан.

Переопределение шаблонов в Django

Для переопределения шаблонов в Django используйте следующие шаги.

Шаг Описание
1. Создайте файл шаблона Создайте новый файл шаблона в каталоге приложения, который вы хотите переопределить. Например, если нужно переопределить шаблон списка пользователей, создайте файл users/user_list.html в каталоге шаблонов приложения users. Имя файла должно точно соответствовать имени шаблона, который вы хотите переопределить.
2. Укажите путь к шаблону В вашем представлении (view) укажите путь к созданному шаблону. Например, если создали users/user_list.html, в представлении укажите 'users/user_list.html'. Важно учитывать структуру каталога шаблонов вашего приложения.
3. Используйте переопределение В новом шаблоне скопируйте содержание оригинального шаблона. Измените только те части шаблона, которые требуют переопределения, например, добавьте или измените какие-то блоки. Используйте доступные в шаблоне переменные из представления, чтобы отображать необходимую информацию.
4. Запустите сервер После внесения изменений в обновленный шаблон запустите сервер, чтобы проверить изменения. Если в файле шаблона есть ошибки, сервер Django их выведет.

Пример. Предположим, у вас есть шаблон base.html, который используется во всех страницах сайта. Вы хотите переопределить его для страницы «Контакты», создав contact/base.html в каталоге шаблонов приложения contact.

В contact/base.html необходимо изменить лишь те части, которые не подходят для страницы «Контакты». Остальное содержимое можно скопировать (и модифицировать) из базового шаблона.

В представлении для страницы «Контакты» вы укажете путь к созданному шаблону: contact/base.html

Настройка пути к каталогу шаблонов

Установите переменную окружения TEMPLATES_DIRS в файле settings.py. Например:

TEMPLATES_DIRS = [ '/home/user/myproject/templates', # Абсолютный путь 'myproject/templates' #Относительный путь, если папка templates в том же каталоге, что и файл settings.py ]

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

В пределах проекта Django, если каталог шаблонов расположен внутри приложения, указывайте его путь относительно приложения:

{% extends 'myapp/base.html' %}

Важно: Убедитесь, что указанные пути действительны и каталоги существуют.

Проверьте, что в файле settings.py задано правильное значение TEMPLATES, которое указывает на список каталогов шаблонов:

TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': TEMPLATES_DIRS, # Здесь указывается путь к нашим каталогам 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ ... ], }, }, ]

После изменений перезапустите сервер разработки Django, чтобы изменения вступили в силу.

Переопределение отдельных блоков и тегов

Для переопределения отдельных блоков в шаблонах Django используйте наследование.

Например, для блока {% block content %} в базовом шаблоне base.html, создайте новый шаблон, например, mypage.html, наследуя его от base.html:


{% extends "base.html" %}
{% block content %}
Это содержимое, переопределяющее блок content.
{% endblock %}

Аналогично, для переопределения тега, например, </code>, измените соответствующий блок в base.html:</p> <pre> <code> {% block title %} Мой базовый заголовок {% endblock %} </code> </pre> <p>В наследовавшем шаблоне переопределите нужный блок:</p> <pre> <code> {% extends "base.html" %} {% block title %} Мой новый заголовок {% endblock %} </code> </pre> <p>Таким образом, вы можете переопределять конкретный блок или тег, сохраняя базовую структуру приложения.</p> <h2>Переопределение блоков в inheriting-шаблонах</h2> <p>Для переопределения блока в наследуемом шаблоне Django используйте тег <strong>{% block %}</strong> в дочернем шаблоне.</p> <p><strong>Пример:</strong></p> <p>В основном шаблоне (например, <code>base.html</code>):</p> <pre><code>{% block content %}{% endblock %}</code></pre> <p>В наследуемом шаблоне (например, <code>mypage.html</code>):</p> <pre><code>{% extends "base.html" %} {% block content %} <p>Вот мои данные.</p> {% endblock %} </code></pre> <p>Этот код покажет контент, заданный в блоке <code>content</code> в шаблоне <code>mypage.html</code>, а не контент блока <code>content</code> в <code>base.html</code>.</p> <p>Обратите внимание, что вы можете вносить изменения в содержимое блока, а не полностью заменять его.</p> <p><strong>Вложенность блоков:</strong></p> <p>Вы можете определить блоки внутри других блоков. Это дает возможность модульного дизайна шаблонов.</p> <pre><code>{% block myblock %} {{some_var}} {% block inner %} <p>Внутри блока.</p>{% endblock %} {% endblock %} </code></pre> <p>Вложенные блоки работают аналогично обычным блокам.</p> <p><strong>Проверка отсутствия блока:</strong></p> <p>Если дочерний шаблон не переопределяет блок, можно проверить его существование:</p> <pre><code>{% block content %} {% if not block.is_variable %} <p>Не переопределён</p> {% endif %} {% endblock %} </code></pre> <p>Можно использовать переменные из шаблона-родителя, при этом сохраняя гибкость.</p> <h2>Использование контекстных переменных в переопределенных шаблонах</h2> <p>Для доступа к данным, переданным в шаблон приложения Django, используйте контекстные переменные. В переопределенном шаблоне вы можете использовать эти переменные точно так же, как и в обычном.</p> <p>Например, если вы хотите отобразить имя пользователя, передаваемое в контексте:</p> <ul> <li>В представлении (view):</li> <li><code>context = {'username': user.username}</li> <li><code>return render(request, 'your_template.html', context)</li> </ul> <p>В переопределённом шаблоне (например, <code>templates/myapp/my_template_override.html</code>):</p> <pre> <p>Привет, {{ username }}!</p> </pre> <p>Таким образом, имя пользователя будет подставлено в шаблон во время рендеринга.</p> <p>Если нужно использовать переменные из родительского шаблона:</p> <p>В родительском шаблоне (например, <code>templates/base.html</code>):</p> <pre> <p>Главный заголовок: {{ main_title }}</p> </pre> <p>В переопределённом шаблоне (например, <code>templates/myapp/my_template_override.html</code>):</p> <pre> <p>Дополнительный текст: {{ extra_info }}</p> </pre> <p>Будет работать, если данные в переменной <code>main_title</code> были переданы в <code>context</code> для родительского шаблона.</p> <p>Важно: контекст должен содержать необходимые переменные. Избегайте обращения к несуществующим переменным.</p> <p>Примеры использования списков и словарей:</p> <ul> <li>Чтобы вывести список:</li> <pre><ul> <li>{% for item in my_list %} {{ item }} </li> {% endfor %} </ul> </pre> <li>Чтобы вывести элемент словаря:</li> <pre><p>{{ my_dict.key }} </p> </pre> </ul> <h2>Работа с фильтрами и тегами Django в переопределенных шаблонах</h2> <p>Для применения фильтров и тегов в переопределённых шаблонах Django, используйте стандартную синтаксическую конструкцию, как в обычных шаблонах.</p> <p><b>Пример:</b> Предположим, у вас есть переопределённый шаблон <code>myapp/templates/myapp/my_template.html</code>, где вы хотите отобразить имя пользователя с заглавной буквы:</p> <pre><code> {% load django_filters %} <p>Привет, capfirst }!</p> </code></pre> <p>В этом примере используется фильтр <code>capfirst</code> стандартной библиотек Django. Обратите внимание на правильный синтаксис с вертикальной чертой.</p> <pre><code> {% load static %} {% for item in items %} <div> <p>Предмет: {{ item.title }}</p> <p>Дата: { item.date}</p> </div> {% endfor %} </code></pre> <p>В этом коде <code>date:"d.m.Y"</code> – специфический формат даты. Важно подключать нужные фильтры, например, <code>django_filters</code>, с помощью <code>{% load django_filters %}</code>.</p> <p><b>Важный нюанс:</b> убедитесь, что фильтры и теги доступны в вашем шаблоне. Также, проверьте правильность именования переменных (<code>item.title</code>, <code>user.username</code>) и корректность работы моделей Django.</p> <h2>Обработка ошибок и отладка переопределенных шаблонов</h2> <p><strong>Проверяйте соответствие имен файлов.</strong> Убедитесь, что имя файла переопределённого шаблона точно соответствует имени файла в шаблоне приложения.</p> <p><strong>Проверяйте синтаксис и структуру.</strong> Неправильный синтаксис HTML, Django-тегов или ошибки форматирования часто ведут к ошибкам рендеринга. Осторожно проверяйте код на ошибки.</p> <p><strong>Рассматривайте иерархию шаблонов.</strong> Убедитесь, что шаблон, который вы переопределяете, находится в соответствующей директории проекта Django. Проверьте, что путь к переопределённому шаблону корректен.</p> <p><strong>Внимательно проверьте используемые переменные.</strong> Если шаблон не находит определённую переменную, проверьте, что переменная существует в контексте. Проверяйте входящие данные.</p> <p><strong>Проверьте настройки приложения.</strong> Некорректные настройки могут заблокировать или изменить работу шаблонов. Проверьте файлы конфигурации.</p> <p><strong>Диагностика ошибок браузера.</strong> Проверяйте консоль браузера. Ошибки JavaScript или CSS, возникающие при работе с переопределенным шаблоном, могут указывать на проблемные места.</p> <p><strong>Используйте специфичные инструменты Django.</strong> Если ошибка возникает при обработке запроса, обратите внимание на логи запросов Django или специальные инструменты отладки.</p> <h2>Вопрос-ответ:</h2> <h4>Как правильно переопределить шаблон в Django, чтобы он отображался в нужном месте приложения?</h4> <p>Переопределение шаблонов в Django происходит через создание собственного шаблона с тем же именем, что и в исходном каталоге шаблонов, но в вашем приложении. Например, если в стандартном шаблоне находятся файлы `base.html`, `registration/login.html`, то чтобы изменить шаблон `base.html`, нужно создать файл `myapp/templates/myapp/base.html` (где `myapp` — имя вашего приложения). Система Django будет использовать вашу версию шаблона, если она существует. Важно убедиться, что путь к вашему новому шаблону правильный и он находится в структуре, понятной Django. В шаблонах используйте теги `{% load %}`, чтобы подключать необходимые функции, и `{% include %}`, чтобы вставлять части шаблонов.</p> <h4>Можно ли менять оформление только одной страницы, а не всего приложения?</h4> <p>Да, это возможно. Вместо переопределения всего шаблона `base.html`, вы можете переопределить только нужные части. Если вам нужно изменить только страницу входа, воспользуйтесь механизмом включения. В шаблоне `base.html` или в другом общем шаблоне, используйте тег `{% include 'registration/my_login.html' %}` для вставки (в нужное место) переопределённого шаблона `my_login.html`. Это позволяет изменить конкретный элемент дизайна, не затрагивая остальные страницы.</p> <h4>Как переопределить шаблон при использовании приложения-расширения? Если я хочу изменить оформление, добавленное сторонним приложением?</h4> <p>Переопределение шаблонов приложения-расширения аналогично переопределению стандартных шаблонов. Создайте в структуре вашего приложения папку `templates` и поместите в неё нужный вам переопределённый шаблон с таким же именем, как у того файла, который вы хотите заменить. Система Django будет искать ваш шаблон в первую очередь, прежде чем обращаться к шаблону, предоставленному расширением. Важно правильно сопоставить структуру названий папок и файлов. Тщательно изучите документацию используемого расширения, чтобы узнать о потенциальных конфликтах и особенностях их обработки.</p> <h4>Возможны ли ошибки при переопределении шаблонов, и как их диагностировать?</h4> <p>Да, ошибки возможны. Частая причина – неправильный путь или имя файла. Проверьте, что переопределённый шаблон находится в правильной папке `templates` в вашем приложении. Используйте инструменты отладки Django, такие как консоль отладки или инструменты разработчика браузера для анализа HTML и ошибок рендеринга шаблонов. Обратите внимание на сообщения об ошибках Django, которые часто содержат ключевые подсказки по локализации проблемы. Внимательно изучайте все пути и имена файлов.</p> <h4>Как избежать конфликтов при переопределении шаблонов с несколькими приложениями в Django?</h4> <p>Конфликты могут возникнуть, если несколько приложений определяют шаблоны с одинаковыми именами. Необходимо чётко разделять имена шаблонов. При переопределении шаблонов убедитесь, что ваше приложение использует уникальные имена файлов шаблонов. Убедитесь, что paths к шаблонам корректно отображаются в вашей структуре проекта Django. Предотвращает ошибки и поддерживает более структурированную и устойчивую архитектуру вашего приложения.</p> <h4>Как переопределить шаблон в Django, чтобы он подключался к определённому каталогу, а не к стандартному?</h4> <p>Для подключения шаблонов Django к нестандартному каталогу, необходимо указать путь к нему в настройках проекта. В файле `settings.py` приложения Django, в переменной `TEMPLATES`, нужно изменить параметр `DIRS`. Вместо стандартного пути к шаблонам, укажите свой путь. Например, если ваша папка шаблонов находится в `templates_app`, а проект находится в `/myproject`, то `DIRS` будет содержать `[os.path.join(BASE_DIR, 'templates_app')]`. Важно убедиться, что указанный каталог существует и содержит необходимые файлы шаблонов. Также, не забудьте обновить `INSTALLED_APPS`, если шаблон используется в новом приложении. В противном случае, Django не сможет найти шаблон при запросе. Важно использовать `os.path.join()` для правильного определения пути, учитывающего разные операционные системы.</p> #INNER#<div class="article-footer"><div class="tags"><a href="/blog/django-i-veb-razrabotka/">Django и веб-разработка</a></div><div class="blog-share"><span>Поделиться:</span><a href="https://vk.com/share.php?url=https%3A%2F%2Fuchilegko.info%2Fblog%2Fdjango-i-veb-razrabotka%2Fpereopredelenie-iz-kataloga-shablonov-prilozheniya-django-python%2F&title=%D0%9F%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B8%D0%B7%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20django%20python&utm_source=share2" rel="nofollow noopener" target="_blank"><i class="fab fa-vk"></i></a><a href="https://t.me/share/url?url=https%3A%2F%2Fuchilegko.info%2Fblog%2Fdjango-i-veb-razrabotka%2Fpereopredelenie-iz-kataloga-shablonov-prilozheniya-django-python%2F&text=%D0%9F%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B8%D0%B7%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20django%20python&utm_source=share2" rel="nofollow noopener" target="_blank"><i class="fab fa-telegram"></i></a><a href="viber://forward?text=%D0%9F%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B8%D0%B7%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20django%20python%20https%3A%2F%2Fuchilegko.info%2Fblog%2Fdjango-i-veb-razrabotka%2Fpereopredelenie-iz-kataloga-shablonov-prilozheniya-django-python%2F&utm_source=share2" rel="nofollow" target="_blank"><i class="fab fa-viber"></i></a><a href="https://api.whatsapp.com/send?text=%D0%9F%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B8%D0%B7%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20django%20python%20https%3A%2F%2Fuchilegko.info%2Fblog%2Fdjango-i-veb-razrabotka%2Fpereopredelenie-iz-kataloga-shablonov-prilozheniya-django-python%2F&utm_source=share2" rel="nofollow noopener" target="_blank"><i class="fab fa-whatsapp"></i></a></div></div></div></div><div class="pane related-posts"><h4 class="decored-title">Похожие статьи</h4><div class="row"><div class="col-lg-4 mb-4 mb-lg-0"><div class="post-preview"><div class="post-preview-cover"><a href="/blog/django-i-veb-razrabotka/django-i18n-django-python/"><img src="/upload/iblock/8a1/q5zzm26xr2334c0nmwqkjw23khhpskpu/kursy_no_code_razrabotki_v_2025_godu.png"></a></div><div class="post-preview-title"><a href="/blog/django-i-veb-razrabotka/django-i18n-django-python/">Переопределение из каталога шаблонов приложения django python</a></div><span>22.06.2025</span></div></div><div class="col-lg-4 mb-4 mb-lg-0"><div class="post-preview"><div class="post-preview-cover"><a href="/blog/django-i-veb-razrabotka/faq-poluchenie-pomoshchi-django-python/"><img src="/upload/iblock/9c0/0xakwmxs5v822xcfgo05oy3sbq4r5bpq/faq_ustanovka_django_python.png"></a></div><div class="post-preview-title"><a href="/blog/django-i-veb-razrabotka/faq-poluchenie-pomoshchi-django-python/">Переопределение из каталога шаблонов приложения django python</a></div><span>22.06.2025</span></div></div><div class="col-lg-4 mb-4 mb-lg-0"><div class="post-preview"><div class="post-preview-cover"><a href="/blog/django-i-veb-razrabotka/napisanie-bolshego-kolichestva-prosmotrov-django-python/"><img src="/upload/iblock/8fa/lejnh3obxx42cp64yh9kse1e7gfhxwhg/napisanie-bolshego-kolichestva-prosmotrov-django-python_289.jpg"></a></div><div class="post-preview-title"><a href="/blog/django-i-veb-razrabotka/napisanie-bolshego-kolichestva-prosmotrov-django-python/">Переопределение из каталога шаблонов приложения django python</a></div><span>22.06.2025</span></div></div></div></div></div><div class="sidebar"><div class="widget"><h3>Популярные статьи</h3><div class="wiget-grp"><div class="post-tmb"><div class="post-tmb-img"><img src="/upload/iblock/164/j04yralgn5zqosbv7w38aubfqln3wyco/yung_pomozhet_razbiraemsya_v_arhetipah_personazhey.png"/></div><div class="post-tmb-cnt"><div class="post-tmb-title"><a href="/blog/psikhologiya/yung-pomozhet-razbiraemsya-v-arkhetipakh-personazhey/">Юнг поможет - разбираемся в архетипах персонажей</a></div><div class="post-tmb-title">22 июня 2025 г.</div></div></div><div class="post-tmb"><div class="post-tmb-img"><img src="/upload/iblock/860/ohuumodvcehg3l38s5b81w4oldcj34zp/chto_takoe_photon_engine_obzor_dvizhka_dlya_sozdaniya_multipleernyh_igr.png"/></div><div class="post-tmb-cnt"><div class="post-tmb-title"><a href="/blog/unity-i-igrovye-dvizhki/chto-takoe-photon-engine-obzor-dvizhka-dlya-sozdaniya-multipleernykh-igr/">Что такое Photon Engine - обзор движка для создания мультиплеерных игр</a></div><div class="post-tmb-title">22 июня 2025 г.</div></div></div></div></div><div class="widget"><h3>Категории</h3><ul class="cat-nav"><li><a href="/blog/biznes-strategii/">Бизнес-стратегии</a></li><li><a href="/blog/vostrebovannye-professii/">Востребованные профессии</a></li><li><a href="/blog/geymdizayn/">Геймдизайн</a></li><li><a href="/blog/grafika-i-3d-modelirovanie/">Графика и 3D-моделирование</a></li><li><a href="/blog/znaniya/">Знания</a></li><li><a href="/blog/igrovaya-industriya-i-biznes/">Игровая индустрия и бизнес</a></li><li><a href="/blog/igrovaya-kultura-i-teoriya/">Игровая культура и теория</a></li><li><a href="/blog/igrovye-metodiki-v-obuchenii/">Игровые методики в обучении</a></li><li><a href="/blog/igrovye-mekhaniki/">Игровые механики</a></li><li><a href="/blog/igrovye-novosti/">Игровые новости</a></li><li><a href="/blog/igrovye-obzory/">Игровые обзоры</a></li><li><a href="/blog/interaktivnye-formaty/">Интерактивные форматы</a></li><li><a href="/blog/iskusstvennyy-intellekt/">Искусственный интеллект</a></li><li><a href="/blog/istoriya-igr-i-studiy/">История игр и студий</a></li><li><a href="/blog/neyroseti/">Нейросети</a></li><li><a href="/blog/prochee/">Прочее</a></li><li><a href="/blog/psikhologiya/">Психология</a></li><li><a href="/blog/razrabotka-igr/">Разработка игр</a></li><li><a href="/blog/rukovodstva-i-gaydy/">Руководства и гайды</a></li><li><a href="/blog/saund-dizayn-i-muzyka-v-igrakh/">Саунд-дизайн и музыка в играх</a></li><li><a href="/blog/testirovanie-i-optimizatsiya-igr/">Тестирование и оптимизация игр</a></li><li><a href="/blog/tekhnologii-v-igrakh/">Технологии в играх</a></li><li><a href="/blog/finansovye-aspekty-igrovoy-industrii/">Финансовые аспекты игровой индустрии</a></li><li><a href="/blog/blender-i-3d-grafika/">Blender и 3D-графика</a></li><li><a href="/blog/django-i-veb-razrabotka/">Django и веб-разработка</a></li><li><a href="/blog/nft-i-blokcheyn-v-igrakh/">NFT и блокчейн в играх</a></li><li><a href="/blog/python-i-programmirovanie/">Python и программирование</a></li><li><a href="/blog/unity-i-igrovye-dvizhki/">Unity и игровые движки</a></li><li><a href="/blog/vr-i-metavselennye/">VR и метавселенные</a></li></ul></div></div></div></div></main><footer class="footer"><div class="footer-top"><div class="container"><div class="row"><div class="col-12 col-sm-4 col-md-4 col-xl-4"><a class="logo-brand" href="/"><span></span>Учи Легко</a></div><div class="col-6 col-sm-4 col-md-4 col-xl-4"><div class="foot-item"><div class="foot-title">Контакты</div><p>E-mail: <span></span></p></div></div><div class="col-6 col-sm-4 col-md-4 col-xl-4"><div class="foot-item"><div class="foot-title">Общее</div><p></p></div></div></div></div></div><div class="footer-btm"><div class="container"><span>© 2025</span><!-- Yandex.Metrika counter --><script type="text/javascript">(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(104256611, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true });</script><noscript> <div><img src="https://mc.yandex.ru/watch/104256611" style="position:absolute; left:-9999px;" alt="alt"/></div></noscript><!-- /Yandex.Metrika counter --></div></div></footer><div class="modal modal-wide fade" id="modal-1" tabindex="-1" aria-labelledby="modal-1Label" aria-hidden="true"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-help"><button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button><div class="modal-help-lft"><span>Поможем подобрать курс</span>чтобы вы получили повышение<br>или новую профессию.</div><div class="modal-help-rht"><div class="modal-form-title">Оставьте заявку, и мы перезвоним</div><form action><div class="form-group"><input class="form-control" type="text" placeholder="Имя"></div><div class="form-group"><input class="form-control" type="tel" placeholder="Телефон"></div><div class="form-group"><input class="form-control" type="email" placeholder="Email"></div><div class="form-check mb-4"><input class="form-check-input" id="agree" type="checkbox"><label class="form-check-label" for="agree">Я соглашаюсь на <a href="#">обработку персональных данных</a></label></div><button class="btn btn-primary btn-full" type="button">Оставить заявку</button></form></div></div></div></div></div><div class="modal modal-simple fade" id="modal-2" tabindex="-1" aria-labelledby="modal-2Label" aria-hidden="true"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button><div class="modal-title">Узнайте какая профессия вам подходит</div><p class="text-center">Пройдите тест - это займет не больше 10 минут</p><form action><div class="form-group"><input class="form-control" type="text" placeholder="Имя"></div><div class="form-group"><input class="form-control" type="email" placeholder="Email"></div><div class="form-check mb-4"><input class="form-check-input" id="agree1" type="checkbox"><label class="form-check-label" for="agree1">Я соглашаюсь на <a href="#">обработку персональных данных</a></label></div><button class="btn btn-primary btn-full" type="button">Пройти тест</button></form></div></div></div><svg width="0" height="0" style="display: none;"><symbol id="prev" viewBox="0 0 24 24" fill="none"><path d="M15 6L9 12L15 18" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></symbol><symbol id="next" viewBox="0 0 24 24" fill="none"><path d="M9 6L15 12L9 18" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></symbol></svg><script src="/js/jquery.min.js"></script><script src="/js/bootstrap.bundle.min.js"></script><script src="/js/slick.min.js"></script><script src="/js/init.js"></script></body></html>