diff --git a/etpgrf_site/blog/templates/blog/tmp.html b/etpgrf_site/blog/templates/blog/tmp.html index 595226c..b083b67 100644 --- a/etpgrf_site/blog/templates/blog/tmp.html +++ b/etpgrf_site/blog/templates/blog/tmp.html @@ -80,8 +80,8 @@ python manage.py hello Иван
 Привет, Иван!

Реальный пример: Массовая типографика через etpgrf

-

В моём проекте, DQ – коллекция цитат. Место для вдумчивого чтения, контент был частично обработан с помощью Типографа Муравьёа, частично вручную. И вот я установил и настроил etpgrf (тем более что Типограф Муравьева «почил в бозе», да и до того не обновлялся с 2018 года). Все новые цитаты типогра­фируются через etpgrf, но что делать со старыми? Их сотни, и открывать и «пересо­хранаять» каждую вручную — это адский труд. Вот тут на помощь и приходит Custom Management Command.

-

Вот как я это реализовал: в web/management/commands/reprocess_typography.py:

+

В моём проекте, DQ – коллекция цитат: место для вдумчивого чтения, контент был частично обработан с помощью Типографа Муравьёа, частично вручную. И вот я установил и настроил etpgrf (тем более что Типограф Муравьёва «почил в бозе», да и до того не обновлялся с 2018 года). Все новые цитаты типогра­фируются через etpgrf, но что делать со старыми? Их сотни, и открывать и «пересо­хранаять» каждую вручную — это адский труд. Вот тут на помощь и приходит Custom Management Command.

+

Вот как я это реализовал. В web/management/commands/reprocess_typography.py:

 from django.core.management.base import BaseCommand
 from web.models import TbDictumAndQuotes
@@ -150,14 +150,14 @@ class Command(BaseCommand):
 
 
         self.stdout.write(self.style.SUCCESS(f"\nГотово!"))
-

Возможно вы заметили, что в моем проекте для контента есть два поля: szContent и szContentHTML. В первом хранится «сырой» текст, во втором — результат типогра­фирования. В вашем проекте, скорее всего только одно поле для контента, но по сути это ничего не меняет.

+

Возможно вы заметили, что в моем проекте для контента есть два поля: szContent и szContentHTML. В первом хранится «сырой» текст, во втором — результат типогра­фирования. В вашем проекте, скорее всего, только одно поле для контента, но по сути это ничего не меняет.

Еще интересные фишки, которые исполь­зовались при типогра­фировании:

  1. self.stdout.write вместо print – позволяет Django перехва­тывать вывод (например, для тестов) и корректно работать с кодировками.
  2. self.style.SUCCESS и self.style.ERROR – раскрашивает текст в консоли (зеленый/красный) и это очень удобно для визуального восприятия логов.
  3. -
  4. Аргумент –dry-run — позволяют безопасно тестировать скрипт на продакшене перед тем, как реально менять данные.
  5. -
  6. Аргументы –limit и –offset — позволяют обрабатывать базу «порциями», что полезно для больших объемов данных (можно запустить несколько процессов параллельно с разными offset).
  7. -
  8. Используется update_fields – позволяет переза­писывать не всю модель целиком (что могло бы затереть изменения, сделанные кем-то другим в ту же секунду), а обновляем только конкретные поля.
  9. +
  10. Аргумент --dry-run — позволяют безопасно тестировать скрипт на продакшене перед тем, как реально менять данные.
  11. +
  12. Аргументы --limit и --offset — позволяют обрабатывать базу «порциями», что полезно для больших объемов данных (можно запустить несколько процессов параллельно с разными offset).
  13. +
  14. Используется update_fields — позволяет переза­писывать не всю модель целиком (что могло бы затереть изменения, сделанные кем-то другим в ту же секунду), а обновляем только конкретные поля.

Теперь, чтобы типогра­фировать весь контент, нам достаточно одной строку в терминале, и Django сделает всю грязную работу за нас (не забудьте инициировать виртуальное окружение вашего проекта).

Тестовый прогон (безопасно, ничего не сохраняет):