IT Блог

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

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

Слайдер Vue 3

Добавил свой простой слайдер на vue 3, который умеет перелистывать изображения зажатием мышки и пальцем на смартфонах. Также в этом слайдере используется тег img для отображения картинок, что семантически чаще всего является правильным в отличие от div.

В примере я использовал typescript, script setup, module css.

<script setup lang="ts">
import { ref } from 'vue'

import Img1 from './1.jpg'
import Img2 from './2.jpg'
import Img3 from './3.jpg'

const slider = ref<HTMLElement | null>(null)
const images = ref([Img3, Img1, Img2])

const current_index = ref(0)
const position = ref(0)

let is_dragging = false
let prev_position = 0
let start_x = 0...

Как исправить двойной запуск тестов с docker в Django

Когда я только перешёл на использование docker и docker compose, Pycharm почему-то начал запускать тестирование дважды. Причём в режиме отладки теста тестирование запускалось один раз, как и положено.

Созданные контейнеры при запуске тестов не содержали дубликатов кода в файловой системе, и Pycharm использовал стандартную команду запуска тестов:

/app/.venv/bin/python /opt/.pycharm_helpers/pycharm/django_test_manage.py test --keepdb content.tests.ContentTest /opt/project/

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

python manage.py test

У меня 2 версии файла docker-compose.yml: один для разработки, а другой для продакшн:

my_app/devops/docker-compose.dev.yml
my_app/devops/docker-compose.prod.yml

Оказалось, что нужно было убрать в файле docker-compose.dev.yml для разработки настройку restart: unless-stopped...


pipenv docker compose в PyCharm

На момент публикации страницы PyCharm не поддерживает pipenv с docker (тикет: ). В чем проблема?

Как вы знаете, Pipenv устанавливает зависимости по разным путям, таким как /home/vivazzi/.local/share/virtualenvs/vivivys-pxi3oUGW/bin/python, где vivivys-pxi3oUG генерируется по-разному в зависимости от разных факторов. С другой стороны, Pycharm требует указать конкретный путь к интерпретатору:

Обратите внимание, что в этом окне мы не можем видеть сгенерированный путь к интерпретатору, поэтому в следующем окне (щелчок через многоточие) мы не знаем, что мы должны ввести:

Если вы введёте путь к глобальному интерпретатору (что-то вроде: /usr/bin/python или /usr/local/bin/python), вы сможете создать доступ к удалённому интерпретатору, но ваше ведь ваше приложение...


content types AttributeError: 'NoneType' object has no attribute '_base_manager'

  ...
  File "/project/core/views/others.py", line 46, in tag_page
    obj = item.content_object
  File "/project/env/lib/python3.8/site-packages/django/contrib/contenttypes/fields.py", line 241, in __get__
    rel_obj = ct.get_object_for_this_type(pk=pk_val)
  File "/project/env/lib/python3.8/site-packages/django/contrib/contenttypes/models.py", line 175, in get_object_for_this_type
    return self.model_class()._base_manager.using(self._state.db).get(**kwargs)
AttributeError: 'NoneType' object has no attribute '_base_manager'

Данная ошибка связана с тем, что django приложение contenttypes не может определить content_object по названию модели и приложения в таблице данных django_content_type. Такая ошибка может появится после изменения имени приложения (напр., у вас было приложение students, а вы поменяли его на school). И если у вас в моделях есть поля типа GenericForeignKey, то content_type (а точнее content_type_id) может ссылаться на устаревшую запись в...


Переопределить Config приложения Django, создаётся лишняя миграция django-cms

Иногда требуется переопределить Config по разным причинам.

Например, в моём случае после обновления django 3.2+ стала автоматически создаваться миграция для django-cms, когда вызываешь makemigrations для своего проекта.

Именно в этой ошибке такое поведение возникло из-за введения default_auto_field (см: ) и установки своего DEFAULT_AUTO_FIELD в значение отличное от django.db.models.AutoField, а именно django.db.models.BigAutoField. Поэтому при вызове makemigrations стала создаваться миграция, в которой для всех моделей django-cms тип поля ID становился BigAutoField.

Чтобы исправить ошибку выше, нужно переопределить CMSConfig, в каком-нибудь своём приложении в любом файле, но для конвенции лучше в apps.py:

# spec/apps.py
from cms.apps import...

Добавление copy_relations за пределами плагина с помощью signals в django cms

В django-cms иногда необходимо добавить или расширить copy_relations() в модели стороннего плагина для обработки внешних ключей: ForeignKey, OneToOneField или ManyToManyField.

Например, есть некое стороннее приложение (cms плагин) text_block с моделью TextBlock:

# models.py
class TextBlock(CMSPlugin):
    title = models.CharField(_('Title'), max_length=255)
    content = models.TextField(_('Content'))


# cms_plugins.py
class TextBlockPlugin(CMSPluginBase):
    model = TextBlock
    name = 'TextBlock'
    render_template = 'text_block.html'

И нам нужно добавить какое-нибудь дополнительное поле, например, description (описание).

Для этого добавляем в проект новое приложение, например, text_block_ext с моделью TextBlockExt:

class TextBlockExt(models.Model):
    text_block = models.OneToOneField(TextBlock, on_delete=models.CASCADE)
    description = models.TextField(_('Description'))

Ext (в слове TextBlockExt) - это сокращение слова Extension...


django.urls.exceptions.NoReverseMatch при создании sitemap django AppHookConfig

При использовании aldryn-apphooks-config (или без него, при стандартном использовании apphooks) может возникнуть ошибка при создании sitemap, например, такая:

   return reverse('{}:category'.format(self.app_config.namespace), kwargs={'slug': self.slug})
django.urls.exceptions.NoReverseMatch: Reverse for 'category' not found. 'category' is not a valid view function or pattern name.

При использовании модели, например, такой:

class Category(models.Model):
    app_config = AppHookConfigField(AlbumConfig, verbose_name='Конфигурация')

    title = models.CharField('Название', max_length=80)
    slug = models.SlugField('Путь', max_length=80, unique=True)

    objects = ActiveQuerySet.as_manager()

    def get_absolute_url(self):
        return reverse('{}:category'.format(self.app_config.namespace), kwargs={'slug': self.slug})


    def __str__(self):
        return self.title

    class Meta(object):
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'

И sitemap:

class SBAlbumCategorySitemap(Sitemap):
    changefreq = 'monthly'
    priority = 0.5
    i18n = True

    def items(self):
        return Category.objects.all()

Хотя на сайте...


django-cms this.ui.container.data(...).push is not a function

В django 3.7.X (возможно, и в более ранней версии) до текущей 3.8.0 (на момент написания статьи) существует ошибка при открытии структуры страницы:

`Uncaught TypeError: this.ui.container.data(...).push is not a function
at s.initialize (bundle.toolbar.min.js:1)

Возникает она тогда, когда шаблон содержит несколько static_placeholder с одинаковыми именами, например: {% static_placeholder 'header' %}.

На гитхабе есть тикет , и пока что разработчики не поправили это дело.

Покопавшись в файле bundle.toolbar.min.js, где возникает ошибка, я смог найти временное решение.

Временное решение ошибки

Нужно скопировать файл /path_to_env_of_my_project/lib/python3.8/site-packages/cms/static/cms/js/dist/3.8.0/bundle.toolbar.min.js в /path_to_my_project/static/cms/js/dist/3.8.0/bundle.toolbar.min.js.

Обратите внимание, что вместо имени папки 3.8.0 используйте имя папки соответствующее вами используемой версии django-cms....


Установка python 3

Установка из репозиториев

apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
apt update
sudo apt install python3.9

Теперь можно проверить, что python установился:

$ python3.9 -V
Python 3.9.4

Если во время apt update после добавления репозитория возникает ошибка:

E: Репозиторий «http://ppa.launchpad.net/deadsnakes/ppa/ubuntu hirsute Release» не содержит файла Release

Можно попытаться исправить ошибку, вписав вместо hirsute доступный репозиторий, который можно найти на странице . Например, вписать bionic. Но при apt update может возникнуть ошибка:

Ошб:5 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic InRelease
  Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY BA6932366A755776
Чтение списков пакетов… Готово
W: Ошибка GPG: http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic...

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.

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

Попробуйте

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