5 11 просмотров

Ошибка UnboundLocalError: cannot access local variable 'ServiceCategory' where it is not associated with a value устранена.

Выполнена проработка хлебных крошек для всех страниц сайта.

Ошибка UnboundLocalError: cannot access local variable 'ServiceCategory' where it is not associated with a value устранена.


🔍 Причина ошибки

В контекст-процессоре  внутри одной из веток функций локально импортировалась модель ServiceCategory (from services.models import Service, ServiceCategory). В Python, если переменная импортируется или присваивается внутри функции, она помечается как локальная для всей области видимости этой функции. В результате обращение к ServiceCategory.objects в конце файла (в словаре nav_categories) до или вне выполнения этого блока вызвало UnboundLocalError.


🛠️ Что сделано

  1. Импорт Service перенесен на глобальный уровень в начало файла 
     рядом с ServiceCategory.
  2. Избыточный локальный импорт внутри main_context() удален.
  3. Исправлен вызов импорта в services/tests.py.

🧪 Результаты проверки

  • Главная страница (http://127.0.0.1:4234/): 200 OK
  • Каталог услуг (http://127.0.0.1:4234/services/): 200 OK
  • Страница детализации услуги (http://127.0.0.1:4234/services/sozdanie-sajta-shop-srednej-slozhnosti/): 200 OK
  • Модульные тесты (python manage.py test services): Успешно пройдены (9/9 OK).

Хронология событий за 13.09.2026

1
В блоке «Заказать услугу» выпадающий список и элемент выбора «Тарифный план» полностью обновлены, сделаны красивыми, интуитивными и читабельными
Другое событие 15:49

В блоке «Заказать услугу» выпадающий список и элемент выбора «Тарифный план» полностью обновлены, сделаны красивыми, интуитивными и читабельными:

🛠 Внесенные изменения:

  1. Информативное форматирование пунктов тарифа ():

    • Вместо монотонных строк с дублированием названия услуги («Базовый - Название услуги») варианты выбора теперь выводят наглядное название, форматированную стоимость и статус (например: ⭐ Стандарт — 45 000 ₽ (Хит)).
  2. Интерактивные чип-кнопки быстрого выбора ():

    • Под полем выбора добавлены стильные плашки-кнопки для моментального клика по тарифу без необходимости раскрывать выпадающий список.
    • При выборе карточки тарифа в блоке «Тарифные планы» форма плавно скроллится, выпадающий список и чип-кнопки автоматически синхронизируются, а сама зона подсвечивается мягким сиянием (glow-effect).
  3. Современная адаптивная стилизация ():

    • Добавлена карточка-обертка с иконкой, закругленными углами, поддержкой как темного, так и светлого оформления интерфейса.
  4. Тестирование:

    • Все 9 модульных тестов приложения services успешно пройдены (python manage.py test services), статические файлы обновлены через collectstatic.
2
Проблема с нечитаемым текстом в режиме «Источник» / «Исходный код»
Другое событие 17:12

Проблема с нечитаемым текстом в режиме «Источник» / «Исходный код» (Source Mode) в редакторе успешно исправлена!

Что сделано:

  1. Стилизация текстового поля исходного кода (CKEditor Source Mode):
    • Добавлены правила для .cke_source и .ck-source-editing-area, устанавливающие тёмно-сланцевый фон (#0f172a) и ярко-белый контрастный текст (#f8fafc).
    • Задан современный моноширинный шрифт (Fira CodeConsolasmonospace) с межстрочным интервалом 1.6 для комфортной работы с HTML-кодом.
  2. Поддержка подсвечивающего движка (CodeMirror Integration):
    • Добавлены контрастные цвета подсветки синтаксиса для тегов, атрибутов, строк, комментариев и чисел в тёмной теме.
  3. Активная кнопка «Источник»:
    • Подсвечивается индиго-акцентом при включенном режиме исходного кода.
3
Выбор Тарифных Планов в Корзине и Динамический Расчет Стоимости
Другое событие 17:26

Выбор Тарифных Планов в Корзине и Динамический Расчет Стоимости

Автоматический перерасчет цены услуги и общего итога ("Всего к оплате:") при выборе тарифных планов в корзине.

Proposed Changes

[Cart Backend & Calculation]

[MODIFY] 

  • В методе Cart.__iter__:
    • Если для услуги выбраны один или несколько тарифных планов (selected_plans), установить цену услуги item['price'] равной сумме цен выбранных тарифов sum(p.price for p in item['selected_plans']).
    • Установить item['price_type'] = 'fixed' при наличии выбранных тарифов для корректного расчета итоговой суммы total_price и общего итога корзины.
    • При отсутствии выбранных тарифов возвращаться к стандартной базовой цене услуги.

[Views & AJAX]

[MODIFY] 

  • В cart_update_plans:
    • Возвращать в JSON-ответе актуальные отформатированные строки:
      • item_price_display — обновленная цена за единицу услуги
      • item_total_price_display — обновленная итоговая цена услуги с учетом количества
      • cart_total_price_display — обновленный общий итог корзины ("Всего к оплате:")
      • selected_plans_info — список названий и цен выбранных тарифов для обновления бейджей

[Templates & Frontend JavaScript]

[MODIFY] 

  • Добавить уникальные ID/классы для колонок цены конкретного товара в таблице и для общего итога в tfoot (id="cart-total-price").
  • В функции updateCartPlans:
    • Обновлять текст в колонке цены товара (price-display), колонке "Итого" товара и в строке "Всего к оплате:".
    • Динамически перерисовывать бейджи выбранных тарифов под названием услуги.

Verification Plan

Automated Tests

  • Запуск python mysite/manage.py test cart для проверки перерасчета стоимости услуги при выборе тарифных планов.

Manual Verification

  1. Открыть http://127.0.0.1:4234/cart/ с услугой, у которой есть тарифные планы (например, 50 000 ₽ и 90 000 ₽).
  2. Выбрать тарифный план (например, "Стандарт" за 90 000 ₽).
  3. Проверить, что цена услуги в строке таблицы мгновенно меняется на 90 000 ₽.
  4. Проверить, что итоговая цена внизу таблицы в строке "Всего к оплате:" мгновенно обновляется до 90 000 ₽.
  5. Выбрать дополнительный тарифный план или снять галочку — проверить динамическое обновление цен.
4
Динамический перерасчет стоимости при выборе тарифных планов в корзине полностью реализован!
Другое событие 17:28

Динамический перерасчет стоимости при выборе тарифных планов в корзине (http://127.0.0.1:4234/cart/) полностью реализован!

Что изменено:

  1. Динамический перерасчет цены:

    • При установке галочек напротив тарифных планов цена услуги автоматически пересчитывается как сумма стоимости выбранных тарифных планов.
    • Значение в строке «Всего к оплате:» внизу таблицы мгновенно обновляется без перезагрузки страницы через AJAX.
    • Также мгновенно обновляются цена услуги в строке, итоговая сумма по услуге и текстовые бейджи под наименованием услуги.
    • При снятии чекбоксов стоимость автоматически возвращается к базовой цене услуги.
  2. Backend и Тесты:

    • В Cart.__iter__ добавлена логика перерасчета item['price'] и cart.get_total_price_display() при наличии выбранных тарифов.
    • В view-функцию cart_update_plans добавлен возврат обновленной цены услуги и общего итога корзины.
    • Написан и запущен юнит-тест, подтверждающий корректность расчетов (результат: OK).

Все подробности внесенных изменений зафиксированы в файле .

Auto-proceeded with

Все работы по настройке выбора тарифных планов и автоматическому перерасчету суммы в строке «Всего к оплате:» полностью завершены. При проверке в браузере сумма пересчитывается на лету при клике на любой тарифный план.

5
Выполнена проработка хлебных крошек для всех страниц сайта.
Другое событие 17:33

Выполнена проработка хлебных крошек для всех страниц сайта.

🛠️ Что было сделано:

  1. Полная русификация навигации:

    • Вся цепочка навигации формируется исключительно на русском языке для всех модулей и страниц: ГлавнаяНовостиПортфолиоУслугиБаза знанийСлужба поддержкиЛичный кабинетКорзинаОтзывыИзбранноеПочтаПоискОформление заказаВходРегистрация и т.д.
  2. Корректная обработка категорий и динамических заголовков:

    • Обновлен контекстный тег в .
    • Устранена проблема пропуска названий категорий в URL (ранее пропускался элемент /category/).
    • Для детальных страниц (статей, услуг, портфолио, тикетов, страниц) из контекста или базы данных извлекаются их реальные русские заголовки вместо транслитерированных слагов (slug).
  3. SEO и читаемость шаблона:

    • Шаблон  снабжен структурированной разметкой Schema.org/BreadcrumbList для поисковых систем и иконкой для пункта «Главная».
    • Убран дублирующий вызов хлебных крошек на странице оформления заказа в .
  4. Улучшение дизайна и контрастности:

    • В  обновлены стили .breadcrumb-fon (стеклянная подложка glassmorphism, эффекты наведения, визуальный разделитель).
    • Обеспечена высокая контрастность текста на любом фоне как в тёмной, так и в светлой теме.