IT Блог

Документации и переводы

Статьи на технические темы

AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready

В общем случае ошибка:

django.core.exceptions.AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time.

говорит о том, что где-то происходит вызов неленивых функций перевода во время импорта пакетов. Другими словами, во время импорта перевод должен быть ленивым, то есть использоваться функция ugettext_lazy (или pgettext_lazy).

Например, в моделях нужно использовать ugettext_lazy (вместо простого ugettext):

from django.db import models
from django.utils.translation import gettext_lazy as _


class MyModel(models.Model):
    title = models.CahrField(_('Title'))

Бывает по трейсбеку не понятно, где нужно...


Добавить иконку в меню и на панель задач в Linux

Для добавления значка (иконки) на панель задач в Linux Mint, нужно сначала добавить иконку в меню, а затем уже можно будет её добавить на панель задач.

Более подробно, как добавить иконку в Linux Mint, смотрите ниже (в других версиях Linux должны быть похожие инструкции).

1. Нажать правой кнопкой мыши на кнопку “Меню” и нажать “Настройки”:

2. Нажать на кнопку “Открыть редактор меню”:

3. Выбрать необходимый раздел, куда нужно добавить иконку, и щёлкнуть "Новый элемент":

4. Прописать путь до скрипта (файла, который запускает программу) и добавить иконку щёлкнув по изображению "Ракеты" рядом с полями:

 Для примера можно добавить в меню программу...


Автоматическое добавление якорей к заголовкам

Технически в html якорь для заголовков может выглядеть так:

<h2 id="my-title">Мой заголовок <a href="#my-title">¶</a></h2>
<p>Произвольный текст</p>

Результат выполнения такого кода:

Автоматически добавлять якорь к заголовкам можно как на стороне сервера, так и на стороне клиента. На стороне сервера придётся хранить дополнительный html-код, который будет загружаться из базы данных для отображения страницы, поэтому мне больше нравится посредством javascript добавлять якоря к заголовкам.

Постановка задачи

В зависимости от важных нужд вы можете изменить предлагаемый код. Я поставил перед собой следующие задачи.

С технической стороны

При наведении на заголовок должен появляться знак ссылки на якорь...


Подключиться к интернету через кабель linux mint

Когда в Linux Mint подключаешь кабель напрямую к компьютеру (не через роутер), то Linux может автоматически создать Ethernet-подключение, которое на первый взгляд должно быть верным:

Но, как ни странно, оно не работает. И я к тому же думал, что во вкладке Защита 802.1x нужно ввести логин и пароль от провайдера. Но оказалось, это не работает.

Нужно создать DSL подключение. Для этого нажимаем "Пуск \ Параметры \ Сетевые соединения" и в открывшимся окне нажимаем "Добавить":

Теперь можно ввести имя пользователя (логин) и пароль, выданный провайдером (в поле служба можно писать, что угодно):

Теперь должно работать:

Подключение через роутер

Через роутер как раз-таки...


Типы ордеров в mql

OrderType() возвращает тип ордера в числовом виде:

Константа Значение Описание
OP_BUY 0 Ордер на покупку
OP_SELL 1 Ордер на продажу
OP_BUYLIMIT 2 Отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня
OP_BUYSTOP 3 Отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня
OP_SELLLIMIT 4 Отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня
OP_SELLSTOP 5 Отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня
OP_BALANCE 6 Пополнение или вывод со счёта
OP_CREDIT 7 Использование кредита
  8 Оплата брокером партнёрского вознаграждения рибейт-партнёрам, являющееся частью спреда с каждой сделки клиента

Послать сообщение об ошибке на почту из django management commands

По умолчанию вы не сможете получать сообщение об ошибках, если management-команда выполняется через cron. Но это легко исправить: достаточно добавить в settings.py дополнительный logger:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        # other loggers
        'management_commands': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        }
    }
}

А в manage.py обернуть команду execute_from_command_line(sys.argv) исключением Exception, например так:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

    from django.core.management import execute_from_command_line
    from logging import getLogger
    import traceback

    logger = getLogger('management_commands')

    try:
        execute_from_command_line(sys.argv)
    except Exception as...

django-select2 в Django

Сходу использовать django_select2 в админке Django не получается из-за того, что django_select2 требует JQuery. Виджет django_select2 по умолчанию не подключает JQuery. Более подробно об этом вы можете прочитать на странице .

Чтобы быстро подключить jQuery к django_select2, сделайте следующее:


Ключ (extended_object_id) уже существует

При публикации страницы в django-cms (3.5.0) может возникнуть ошибка:

Exception Type: IntegrityError at /admin/cms/page/312/ru/publish/
Exception Value: ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "spec_pageext_extended_object_id_key"
DETAIL: Ключ "(extended_object_id)=(324)" уже существует.

По-английски:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "spec_pageext_extended_object_id_key"
DETAIL:  Key (extended_object_id)=(324) already exists.

Из трейсбека понятно, что ошибка связана с Extension (Расширение страницы).

Ещё нужно сказать, что ошибка не всегда проявляется при публикации страницы. Чтобы воспроизвести ошибку нужно:

  1. Создать расширение (или по-другому "Сохранить" из Меню / Страница / Моё расширение)
  2. Опубликовать страницу
  3. Перейти на черновую версию, щёлкнув "Изменить"
  4. Удалить расширение...

'NoneType' object has no attribute 'get_all_fields' parler

Если при создании своей миграции для добавления полей, которые должны быть переводимы, возникает ошибка:

'NoneType' object has no attribute 'get_all_fields'

1 вариант. Обновить parler до новой версии

В новых версиях parler эта ошибка устранена, поэтому достаточно обновить пакет. 

2 вариант. Добавить TranslatableModelMixin в базовые классы модели

Просто добавьте MyModel.__bases__ = (models.Model, TranslatableModelMixin) после объявления MyModel.

Для наглядности возьмём  и добавим необходимую строчку:

from django.db import migrations
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist


def forwards_func(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'MyModel')
    MyModel.__bases__ = (models.Model, TranslatableModelMixin)
    MyModelTranslation = apps.get_model('myapp', 'MyModelTranslation')

    for object...

Не работает hg pull

Если у вас перестал работать hg pull и выдаётся ошибка:

abort: error: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:581)

Или даже такая:

То попробуйте обновить mercurial до версии 3.3 и выше:

pip install mercurial==3.3

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

Ошибка abort: error: [SSL: WRONG_VERSION_NUMBER] wrong version number стала появляться у пользователей bitbucket, которые используют mercurial старых версии с протоколом TLSv1 и TLSv1.1. Теперь BitBucket поддерживает протоколы TLSv1.2. Подробнее на странице .

Это значит, что нужно обновить mercurial до версии 3.3 и выше. Обнаружил версию экспериментально, так как в истории изменений  не нашёл упоминания об TLS.  

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте

Выберите валюту для отображения денежных единиц