IT Блог

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

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

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.  


wget 403: Forbidden

Если при скачивании сайта командой wget, например с такими параметрами:

wget -r -k -l 7 -p -E -nc http://site.ru/

у вас возникла ошибка 403 Forbidden:

HTTP-запрос отправлен. Ожидание ответа... 403 Forbidden
2018-11-10 13:25:41 ОШИБКА 403: Forbidden.

Попробуйте добавить заголовки к команде:

wget -r -k -l 7 -p -E -nc --header="User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11" --header="Referer: http://xmodulo.com/" http://site.ru/

Кто-то использует ещё заголовок --header="Accept-Encoding: compress, gzip", но у меня с ним не заработало.

Если...


Добавить jquery в widget Django

Есть два простых способа добавить jQuery в формы или виджеты в админку django

1. Добавление другой версии jQuery

Сначала нужно . В качестве примера для этой статьи я использовал . Помещаем её, например, сюда: my_project/static/jquery/jquery-2.2.0.min.js.


TypeError: (intermediate value)

Неожиданным образом может вылезти ошибка javascript:

TypeError: (intermediate value)

Как оказалось одна из причин - просто не поставлена точка с запятой после объявления переменной, например:

form_uploader_ru:
var form_uploader_lang = {
    sending: 'Отправка...',
    file_sending: 'Отправка файла...',
    send: 'Отправить'
}; <--- Обязательно нужно поставить знак ";"

Попробуйте проверить, все ли ваши переменные закрываются точкой с запятой (";").

Как эта ошибка возникла в моём коде?

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

Меня сбило то, что локально всё замечательно работало, а на сервере возникала ошибка. Потом уже путём поочерёдного исключения, подключаемых скриптов...


Воспроизвести ошибку в браузере, полученную на почте от Django

Как правило, если возникает 500 ошибка вашего приложения на сервере, то посылается сгенерированный Django-отчёт об ошибке (трейсбек) электронным адресам, указанным в ADMINS в settings.py. Это может выглядеть примерно так:

Internal Server Error: /billing/online_reg_ip/

KeyError at /billing/online_reg_ip/
'birthday_day'

Request Method: POST
Request URL: https://site.ru/billing/online_reg_ip/
Django Version: 1.10.7
Python Executable: /usr/bin/uwsgi-core
Python Version: 2.7.9
Python Path: ['/path_to_project/src/', '.', '', ...]
Server time: Ср, 21 Мар 2018 08:40:50 +0800
Installed Applications: (u'django.contrib.contenttypes', ...)
Installed Middleware: (u'django.middleware.cache.UpdateCacheMiddleware', ...)

Traceback: 
File "/path_to_projet/env/local/lib/python2.7...

AttributeError: Module Pip has no attribute 'main' 10.X

Начиная с pip версии 10.X, появляется ошибка при вызове функции pip.main():

AttributeError: Module Pip has no attribute 'main'

Функция main() переехала в модуль _internal (pip._internal), поэтому можно откатить pip до версии 9.X, например так:

pip install --upgrade pip==9.0.3

Или импортировать main() из _internal:

from pip._internal import main

Если у вас на разных машинах (напр, на локальной и боевой, как было в моём случае) стоит pip разных версий, то можно воспользоваться отлавливанием исключения ImportError:

try:
    from pip._internal import main
except ImportError:
    from pip import main

PROJECT_ROOT = abspath(dirname(__file__))
main(['install', '-r...

help_text для кастомного field admin django

Иногда хочется добавить help_text для своего кастомного поля в админке Django, например так:

from django.contrib import admin

class MyModelAdmin(admin.ModelAdmin):
    fields = ('title', 'custom_field')

    def custom_field(self, obj):
        # some code...
        return some_result

    custom_field.help_text = _('Custom help text')

Но до сих пор (на момент написания статьи 6 мая 2018 года) для кастомный полей в настройке admin-класса Django такой функции нет. Поэтому самый простой способ добавить вспомогательный текст - сделать это вручную. Например:

from django.contrib import admin

class MyModelAdmin(admin.ModelAdmin):
    fields = ('title', 'custom_field')

    def custom_field(self, obj):
        # some code...
        return '{}<p class="help">{}</p>'.format(some_result, _...

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

Попробуйте