# Структура шаблонов EUSRR ## 📁 Организация проекта ``` templates/ ├── base.html # Базовый layout ├── admin/ # Административные шаблоны ├── auth/ # Авторизация, регистрация ├── communications/ # Чаты, сообщения ├── documents/ # Документы ├── emails/ # Email-шаблоны ├── employees/ # Сотрудники, отделы │ └── components/ # Переиспользуемые компоненты ├── feed/ # Лента новостей │ └── includes/ # Компоненты ленты ├── includes/ # Общие компоненты │ ├── navbar.html │ ├── sidebar.html │ └── calendar/ # Компоненты календаря ├── requests_app/ # Заявления сотрудников │ └── components/ # Компоненты заявлений └── search/ # Поиск REFACTORING_PLAN.md # План рефакторинга ``` ## 🎨 Архитектура ### Базовый шаблон (base.html) Все страницы наследуются от `base.html`: ```django {% extends "base.html" %} {% load static %} {% block title %}Название страницы{% endblock %} {% block extra_css %} {% endblock %} {% block content %} {% endblock %} {% block extra_js %} {% endblock %} ``` ### Структура блоков в base.html - `{% block title %}` - Заголовок страницы - `{% block extra_css %}` - Дополнительные CSS файлы - `{% block content %}` - Основное содержимое - `{% block extra_js %}` - Дополнительные JavaScript файлы ## 🔧 Компоненты ### Общие компоненты (includes/) #### navbar.html Навигационная панель приложения: - Логотип - Поиск - Меню пользователя - Уведомления ```django {% include "includes/navbar.html" %} ``` #### sidebar.html Боковая панель навигации: - Меню разделов - Профиль пользователя - Быстрые ссылки ```django {% include "includes/sidebar.html" %} ``` #### calendar/calendar_styles.html Стили календаря (подключает CSS): ```django {% include "includes/calendar/calendar_styles.html" %} ``` ### Компоненты сотрудников (employees/components/) #### department_styles.html Стили для колеса команды: ```django {% include "employees/components/department_styles.html" %} ``` ### Компоненты ленты (feed/includes/) #### _post_card.html Карточка поста в ленте: ```django {% include "feed/includes/_post_card.html" with post=post %} ``` ## 📝 Именование файлов ### Соглашения - `{model}_list.html` - Списки (employees_list.html) - `{model}_detail.html` - Детальные страницы (employee_detail.html) - `{model}_form.html` - Формы создания/редактирования (post_form.html) - `{model}_confirm_delete.html` - Подтверждение удаления - `components/{name}.html` - Переиспользуемые компоненты - `_{name}.html` - Партиалы (только в старых файлах, новые без подчёркивания) ## 🎯 Использование CSS ### Подключение стилей Всегда используйте `{% block extra_css %}`: ```django {% block extra_css %} {% endblock %} ``` ### Встроенные стили ❌ **Избегайте:** ```django ``` ✅ **Используйте компоненты:** ```django {% block extra_css %} {% endblock %} ``` ## 🚀 JavaScript ### ES6 модули Используйте ES6 модули для JavaScript: ```django {% block extra_js %} {% endblock %} ``` ### Встроенные скрипты ❌ **Избегайте больших скриптов:** ```django ``` ✅ **Создавайте модули:** ```javascript // static/js/components/myComponent.js export class MyComponent { // ... } ``` ## 📦 Переиспользуемые компоненты ### Передача контекста Компоненты получают данные через `with`: ```django {% include "includes/avatar.html" with user=employee size="lg" %} ``` ### Создание компонента ```django {# includes/components/avatar.html #} {% load static %}
{% if user.avatar %} {{ user.get_short_name }} {% else %} {% endif %}
``` ## ✨ Лучшие практики ### 1. Всегда загружайте static ```django {% load static %} ``` ### 2. Используйте CSRF токены ```django
{% csrf_token %}
``` ### 3. Безопасный вывод ```django {{ user.name|escape }} {# Экранирование HTML #} {{ post.content|safe }} {# Только для доверенного контента #} ``` ### 4. Условный рендеринг ```django {% if user.is_authenticated %}

Добро пожаловать, {{ user.get_short_name }}!

{% else %} Войти {% endif %} ``` ### 5. Циклы с empty ```django {% for employee in employees %}
{{ employee.name }}
{% empty %}

Сотрудников не найдено

{% endfor %} ``` ## 🔍 Отладка ### Проверка переменных ```django
{{ variable|pprint }}
``` ### Debug toolbar ```django {% if debug %} {% endif %} ``` ## 📊 Статистика рефакторинга ### До рефакторинга - Файлов: 61 - Строк кода: 11,479 - Встроенных CSS: 1,359 строк - Встроенных JS: 4,522 строк - Дублирующих файлов: 3 ### После рефакторинга (Фаза 5) - Файлов: 58 - CSS компонентов: 21 - Встроенных CSS: 0 строк ✅ - Встроенных JS: ~200 строк - Дублирующих файлов: 0 ✅ ### Улучшения - ✅ Устранено 100% дублирования - ✅ Извлечено 3,529 строк CSS в компоненты - ✅ Создана единая архитектура стилей - ✅ Все шаблоны используют централизованные CSS ## 🚧 Текущие задачи ### Фаза 6 (В процессе) - ✅ Создать `variables.css` с полным набором переменных - ✅ Документировать CSS структуру - ⏳ Документировать JavaScript структуру - ⏳ Создать финальный отчёт ## 🔗 Связанные документы - [План рефакторинга](REFACTORING_PLAN.md) - Полный план работ - [CSS README](../static/css/README.md) - Документация CSS - [JS README](../static/js/README.md) - Документация JavaScript (TODO) ## 📞 Контакты **Автор рефакторинга:** GitHub Copilot **Дата создания:** 28 октября 2025 **Версия:** 1.0 --- ## Быстрый старт ### Создание новой страницы 1. Создайте HTML шаблон: ```django {# myapp/my_page.html #} {% extends "base.html" %} {% load static %} {% block title %}Моя страница{% endblock %} {% block extra_css %} {% endblock %} {% block content %}

Моя страница

{% endblock %} {% endblock %} ``` 2. Создайте CSS компонент (если нужен): ```css /* static/css/components/my-component.css */ /** * my-component.css * Описание компонента */ .my-class { border-radius: var(--feed-radius); box-shadow: var(--feed-shadow); } ``` 3. Создайте view: ```python # myapp/views.py from django.views.generic import TemplateView class MyPageView(TemplateView): template_name = "myapp/my_page.html" ``` 4. Добавьте URL: ```python # myapp/urls.py from django.urls import path from .views import MyPageView urlpatterns = [ path('my-page/', MyPageView.as_view(), name='my_page'), ] ``` Готово! 🎉