IT Блог

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

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

Исправление ошибок запуска приложений на python 2.x

Ниже расположен список ошибок, которые мне встретились при запуске приложений на python 2.X (при переходе с python 3.X).

ImportError: No module named parse

from urllib.parse import urlparse
ImportError: No module named parse

Решение: заменить from urllib.parse import urlparse на import urlparse.

SyntaxError: invalid syntax

SyntaxError: invalid syntax
print('some', end='\r')

Решение: добавить импорт from __future__ import print_function.

ImportError: No module named queue

ImportError: No module named queue

Решение: заменить import queue на import Queue.

ImportError: No module named parse

from urllib.parse import unquote
ImportError: No module named parse

Решение: заменить from urllib.parse import urlparse на from urllib import...


Добавить параметры сайта в Django и использование их в шаблонах

Простая реализация добавления своих параметров в Django. Это полезно, например, если вы хотите на время закрыть какой-то раздел, но оставить открытым для суперпользователей.

# models.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models


class SiteParameter(models.Model):
    parameter = models.CharField('Параметр', max_length=255)
    value = models.CharField('Значение', max_length=255)
    description = models.TextField('Описание параметра', blank=True)

    def __unicode__(self):
        return self.parameter

    class Meta:
        verbose_name = 'Параметр сайта'
        verbose_name_plural = 'Параметры сайта'
# admin.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from sb_utils.models import SiteParameter


@admin.register(SiteParameter)
class SiteParameterAdmin(admin.ModelAdmin):
    search_fields = ('parameter', 'value', 'description')
    list_display = ('parameter', 'value', 'description')

    fieldsets...

no reverse for django.contrib.auth.views.password_reset_confirm

Если встретилась ошибка no reverse for django.contrib.auth.views.password_reset_confirm, то можно добавить следующие урлы:

from django.contrib.auth.views import password_reset_confirm

urlpatterns = patterns('',
    ...
    url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<uidb64>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', password_reset_confirm, name='password_reset_confirm'),
)

Или если использовать свой шаблон для рендера страницы "Сброса пароля" при использовании представления, основанного на классах, как это сделано в django shop:

from shop.views.auth import PasswordResetConfirm

urlpatterns = patterns('',
    ...
    url(r'^password-reset-confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/?$',
        PasswordResetConfirm.as_view(template_name='myshop/pages/password-reset-confirm.html'),
        name='password_reset_confirm'),
)

Трюки в python

В интернете много видел интересных фишечек и трюков:

  • http://sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html
  • https://habrahabr.ru/post/85238/
  • https://habrahabr.ru/post/85459/

Не помню зачем, но давно решил у себя на блоге оставить ниже перечисленные трюки. Если оставил, значит пусть будет :)

Проверка, содержится ли элемент списка list1 в списке list2

list1 = [1, 2, 3]
list2 = [2]
for elem in list1:
    print(elem, ['not found', 'found'][elem in list2])


Экспорт данных из mysql в csv

Потребовалось для одного проекта вытащить данные из mysql и сохранить их в простом формате cvs для дальнейшей обработки. Эта статья - просто заметка, которая собственно ничего не разъясняет. Она лишь нужна, если мне вдруг снова придётся вытаскивать данные из mysql.

Восстановление БД

E:\Vivazzi\project\dumps\db.sql> C:\WebServers\usr\local\mysql-5.5\bin\mysql.exe -u root -p db_project < db.sql

Создание дампа

  1. Зайти на http://localhost/Tools/phpMyAdmin/index.php.
  2. Выбрать желаемую экспортируемую таблицу.
  3. Выбрать вкладку Экспорт.
  4. Выбрать "Способ экспорта" - "Обычный - отображать все возможные настройки".
  5. Кодировка файла: при необходимости поменять на windows-1521 или другую.
  6. Выбрать формат данных: CVS для MS Excel.
  7. Выделить галочкой пункт "Поместить названия полей в первой строке".

Добавить свои нередактируемые поля при редактировании объекта в admin django

Как оказалось, свои нередактируемые поля при редактировании объекта в django не так и сложно. Для этого нужно в admins.py нашего приложения добавить метод с произвольным именем, передав аргумент obj (или другой по вкусу) и определив некоторые свойства. Например, чтобы просто отобразить произвольный html-код нужно написать следующее:

@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    readonly_fields = ('test_field', )

    def test_field(self, obj):
        return '<a href="\test_page\">Открыть тестовую страницу</a>'

    test_field.short_description = 'Ссылка'
    test_field.allow_tags = True

Как видно из примера выше, создаём метод, например test_field(self, obj), и добавляем его в список readonly_fields.


Отсортировать теги по имени, используя django-taggit и django-taggit-labels

С помощью django-taggit-labels теги можно отобразить следующим образом:

И это достаточно удобно! Так как видишь, какие теги у тебя есть, а другими словами какие теги можно связать с объектом, например, со статьёй в блоге. Когда есть простое поле ввода тегов, можно легко в разных статьях создать теги js и javascript или "Другое" и "Разное", которые являются одним и тем же по значению. Или даже "другое" и "Другое", значения которых одинаково только регистр первой буквы разный (как на скриншоте выше). С django-taggit-labels вы оградите себя от подобных одинаковых по значению тегов, благодаря их визуальному отображению.

Ниже представлен способ сортировки тегов по...


Расширить django-taggit

Потребовалось мне улучшить отображение django-taggit в админке. Делается это путём расширения приложения, которое достаточно хорошо описано в официальной документации. Но тем не менее я решил показать на примере, как можно кастомизировать отображение тегов приложения taggit в админке.

Поставленные задачи:

  1. Добавить колонку "Количество элементов" на страницу списка тегов для того, чтобы удобно было смотреть каких тегов меньше всего. Владея этой информацией, можно, например, добавить ещё статей с этими тегами.
  2. Убрать пустые "Элементы с меткой", которые добавляются по умолчанию на странице редактирования тега.
  3. Отобразить "Смотреть на сайте" как для "Тега" (Метки), так и для "Элемента с меткой".

Решение:

Для того чтобы в...


bundle.toolbar.min Cannot read property 'replace' of undefined

Ошибка Cannot read property 'replace' of undefined в файле bundle.toolbar.min.js может возникнуть, если на странице присутствуют два Django CMS placeholder-а.

В моём случае данная ошибка не позволяла открыть окно редактирования компонентов в некоторых заполнителях.


'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) в блоке show_menu или breadcrumbs

При возникновении ошибки 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) django указывать на то, что что-то с show_menu {% show_menu 0 100 3 100 %} или, например, с show_breadcrumb {% show_breadcrumb 0 "cms/breadcrumbs.html" 1 %}:

Как ни странно, но ошибка возникает, если после обновления Django CMS на версию 3.4.0 у вас было зарегистрировано какое-то своё cms-приложение (apphook) и файл назвался cms_app.py.

Причём интересно то, что если посмотреть трейсбек, то увидим, что проблема-то в показе русских букв. Да, собственно, такая ошибка возникает при проблеме с кодировкой. Нужно всего лишь-то использовать unicode. Если по дебагеру посмотреть, то...

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

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

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

Попробуйте

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