IT Блог

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

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

Отловить событие автозаполнения в js

Чтобы поймать событие автозаполнения поля (см. рисунок ниже) нужно использовать событие oninput.

Фактически, слушая событие oninput, мы отлавливаем любое изменение поля в том числе, если щёлкаем по пункту в автокомплите. Вот простой пример:

$input.on('input', function(){
    alert('Содержимое поля изменилось');
});

oninput вызывается при изменении содержимого инпута без потери фокуса поля. Такое поведение как раз и отличает oninput от onchange, которое вызывается при потере фокуса и если содержимое поля изменилось.


Сериализация модели Django через Manager

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.core import serializers
from django.db import models
from django.utils.encoding import python_2_unicode_compatible


@python_2_unicode_compatible
class ExampleModelManager(models.Manager):
    def to_json(self):
        return serializers.serialize('json', self.all(), fields=('field_1', 'fields_N'), ensure_ascii=False)


class ExampleModel(models.Model):
    # ...

    objects = ExampleModelManager()

Теперь можно в коде вызывать сериализацию ExampleModel.objects.to_json()


Настойка локальной сети в Windows и Linux Mint. Создание общей папки

Настроить локальную сеть между Linux и Windows через роутер по Wi-Fi оказалось не сложной задачей. Возможно, настройки по умолчанию были выстроены как надо. Честно сказать, я не специалист по настройке локальной сети и данная статья не содержит каких-то углублённых настроек и сложной конфигурации сети. Всё просто: обмен данных идёт через роутер, доверяем сети и позволяем Windows и Linux менять содержимое папки.

Покажу как я настраивал обмен данными по локальной сети через расшаренную папку. Для взаимодействия Linux с другими компьютерами нужно установить samba:

sudo apt-get install samba

Создаём папку с необходимым именем (напр., shared_folder) в своей домашней папке и открываем доступ...


Расширение breadcrumbs в Django cms

Наглядный пример, как можно расширить навигационную цепочку или по-другому breadcrumbs в Django cms.

Например, нужно добавить ещё одни дополнительный элемент к хлебным крошкам. Тогда в шаблоне пишем:

 <div class="row">
    {% with extra_ance='extra element' %}
        {% show_breadcrumb 0 "my_app/breadcrumbs.html" %}
    {% endwith %}
</div>

А сам файл breadcrumbs.html может быть следующим:

<ul>
{% for ance in ancestors %}
    {% if not forloop.last or extra_ance %}
        <li><a href="{{ ance.get_absolute_url }}">{{ ance.get_menu_title }}</a></li>
    {% else %}
        <li class="active">{{ ance.get_menu_title }}</li> {% endif %}
    {% endfor %}
    {% if not forloop.last or extra_ance %}<span class="separator">&#8250;</span>{% endif %}
    {% if extra_ance %} <li class="active">{{ extra_ance...

AttributeError: 'NoneType' object has no attribute 'has_header'

Когда возникает ошибка следующего рода:

    if not response.has_header('Last-Modified'):
 
AttributeError: 'NoneType' object has no attribute 'has_header'

то причина может быть самая разнообразная. Чаще всего, какой-то метод не возвращает response, поэтому проверьте все свои views на то, что они возвращают HTTPResponse, а также проверьте все переопределённые методы в классах.

Так, например, однажды мой переопределённый метод change_view в классе admin ничего не возвращал при определённом условии:

def change_view(self, request, object_id, form_url='', extra_context=None):
    obj = self.model.objects.get(id=object_id)

    for color in obj.colors.all():
        for pic in color.pics.all():
            # some code

        return super(ProductAdmin, self).change_view(request, object_id, form_url, extra_context)

Как видите, если obj.colors.all() пуст, то change_view ничего не вернёт (а...


Примеры вёрстки

Пример верстки логотипа

.logo_c .wrapper {padding-left: 48px;margin-top: 68px;text-transform: uppercase;display: inline-block;position: relative;}
.logo_c .wrapper::after {top:-31px;background: url('../images/logo.png') no-repeat;width: 165px;height: 118px;content: '';position: absolute;left:0;}
.logo_c .wrapper span {text-transform: uppercase;display: block;text-align: center;}
.logo_c .wrapper span:first-child {font-size: 47px;border-bottom: 1px solid #333;}
.logo_c .wrapper span:last-child {font-size: 21px;padding-top: 2px;}

Пример использования сессий в плагинах Django CMS

Доступ к использованию сессий в Django прост:

request.session['a'] = 5
request.session['is_visit'] = True

request.session['a']  # = 5

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

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

# -*- coding: utf-8 -*-
from cms.plugin_pool import plugin_pool
from cms.plugin_base import CMSPluginBase


class MenuLogicPlugin(CMSPluginBase):
    name = 'Menu'
    render_template = 'spec/menu.html'
    cache = False  # важно отключить кэш!

    def...

sql перенос данных из одной таблицы в другую

Возникла следующая проблема: для некоторого приложения нужно было удалить поле tags = TaggableManager(blank=True) (и соответственно зависимость django-taggit). Как обычно, стираю это поле и вызываю makemigration, который сделал своё дело как надо. Но при вызове migrate для другого проекта с тем же набором миграций происходит ошибка, что приложение taggit не найдено для выполнения миграций. Оно, конечно, и логично, что миграции будут требовать это приложение.

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

Перенос...


Округление в python

Округление в python осуществляется функцией round(number, ndigits), где number - округляемое число, а ndigits - количество знаков после запятой. Например:

round(2.137, 2)  # = 2.14

Иногда округление может дать неожиданный результат, например:

round(2.45, 2) # = 2.5
round(2.55, 2) # = 2.5, а не 2.6!

Это связано с неточностью представления типа float (см. ). Так как в компьютере числа записываются в двоичном виде, то приблизительно можно посмотреть, как хранятся числа 2.45 и 2.55, с помощью строкового представления чисел в python. Выведем данные числа с точностью до 30 знаков после запятой:

>>> '%0.30f' % 2.45
'2.450000000000000177635683940025'
>>> '%0.30f' % 2.55...

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

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

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

Попробуйте

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