IT Блог

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

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

Автоматическое изменение высоты окна в fancybox

Наткнулся на ошибку автоматического изменения высоты всплывающего окна fancybox. Модальное окно должно автоматически изменять размер при динамическом добавлении, удалении или изменении размеров элементов внутри окна, но, как оказалось, оно перестаёт автоматически меняться если задана опция минимальной ширины minWidth. Так, например, следующая конфигурация будет ломать авто изменение высоты:

<a class="btn show_modal" href='#modal_content'>Открыть модальное окно</a>

<div id="modal_content">
    <p>Содержимое модального окна</p>
</div>

$('.show_modal').fancybox({
        minWidth: 500,  # из-за этого параметра minWidth ломается автоматическое измение высоты модального окна
        maxWidth: 900,
        maxHeight: 600
    });

Для решения подобного "эффекта" нужно убрать этот параметр:

$('.show_modal').fancybox({
        maxWidth: 900,
        maxHeight: 600
    });

И настроить css-стили, например, так:

#modal_content {
    min-width:...

Данные управляющей формы отсутствуют или были повреждены

Редко встречающаяся ошибка в Django: "Данные управляющей формы отсутствуют или были повреждены" может возникать по разным причинам:

1. Отсутствует переменная formset.management_form в шаблоне. Решение: добавить в шаблон:

{{ formset.management_form }}

2. После обновления библиотек, например Django, на новую версию. В таком случае нужно проверить совместимость версий библиотек и соответственно всё обновить.

3. Если вы используете django-nested-admin, то проверьте везде ли вы наследуетесь от NestedTabularInline / NestedStakedInline для своих инлайновых admin-класс, например:

class TilePictureInline(NestedStackedInline):
    model = TilePicture
    extra = 0


class ColorInPatternInline(NestedTabularInline):
    model = ColorInPattern
    extra = 0


class TileInline(NestedStackedInline):
    model = Tile
    extra = 0
    inlines = (TilePictureInline, ColorInPatternInline)...

Не открывается страница на сайте Django

Встретил весьма странную проблему: не открывается страница на сайте django cms. То есть нажимаешь обновить страницу, и индикатор загрузки крутится и не может показать страницу. Логи в IDE вообще молчат: ничего не показывают, как будто я вовсе и не загружаю страницу.

Попробуйте почистить папку, куда складывается вся статика после вызова команды pytrhon manage.py collectstatic. В моём случае такая папка называется collect_static.

Кому интересно можете прочитать, как я находил ошибку.

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

Прежде всего поочерёдно поотключал...


django rest framework 405 method not allowed

Причины возникновения ошибки 405 method not allowed достаточно много. Если вы используете django-shop, то попробуйте проверить импорт настройки в settings.py:

MIDDLEWARE_CLASSES = (
    ...
    'shop.middleware.MethodOverrideMiddleware',
    ...
)

Конечно, можно отдельно от django-shop использовать этот middleware в своих проектах. Сам код middleware представляет собой следующее:

class MethodOverrideMiddleware(object):
    """
    This middleware is required to emulate methods PUT and DELETE using a HTTP method POST
    as wrapper. Some misconfigured proxies do not pass these methods properly, hence this
    workaround is required.
    """
    METHOD_OVERRIDE_HEADER = 'HTTP_X_HTTP_METHOD_OVERRIDE'

    def process_view(self, request, callback, callback_args, callback_kwargs):
        if request.method != 'POST':
            return
        if self.METHOD_OVERRIDE_HEADER not in request.META:...

Пустая строка в select angular

Значение, которое вы хотите присвоить для select в angular, должно быть строковым типом. Вот пример правильного присваивания:

<div class="sb_tyre_calc" ng-controller="my_ctrl">
    <label for="id_my_field">Ширина</label>
    <select id="id_my_field" name="my_field" ng-change="update()" ng-model="my_field">
        <option value="145">145</option>
        <option value="185">185</option>
    </select>
</div>
(function(angular, undefined) {
    'use strict';

    angular.module('my_module', []).controller('my_ctrl', function($scope) {
        $scope.init = function() {
            $scope.my_field = '185';  # именно в кавычках!
            ...
        };

        $scope.update = function() {
            ...
        };

        $scope.init();
        $scope.update();
    });

})(window.angular);

Обратите внимание, что присваивая my_field в функции init(), а именно $scope.my_field = '185' мы должны передать строковое значение (а не числовое).

Если попытаться использовать число, то angular отрендерит select примерно так:

<select id="id_my_field"...

Использование ifchange вместо regroup

Шаблонный тег regroup хорош для группировки выводимых данных в шаблоне. Но не менее полезен похожий шаблонный тег ifchange, который будет выводить содержимое, если входящий параметр отличается от предыдущего в цикле. Для меня его использование легче запоминается.

Реальный пример кода одного моего проекта :

{% for product in products %}
    {% ifchanged product.diameter %}<h2>R{{ product.diameter }}</h2>{% endifchanged %}
    <div class="item">
        <div class="t">{{ product.get_title }}</div>
        <p>Размер: {{ variant.get_size }}</p>
        <p>Цена: {{ variant.get_state }}</p>
        <p>Стоимость: {{ variant.get_price_html }}</p>
    </div>
{% endfor %}

Объекты products - это автомобильные шины. Чтобы легче было находить нужный размер, шины должны быть сгруппированы по диаметру. А чтобы...


bleach linkify Оборачивание localhost:8000

bleach linkify() пока, к сожалению, не умеет оборачивать ссылки локалхоста типа localhost:8000, но можно написать небольшой workaround, суть которого заключается в следующем: мы заменяем localhost:8000 на какой-нибудь несуществующий сайт, напр. dummy_site.ru, затем применяем linkify() и в заключении возвращаем localhost:8000. Вот небольшой реальный пример:

class Log(models.Model):
    content = models.TextField('Содержание лога')

    def get_content(self):
        def set_target(attrs, new=False):
            attrs['target'] = '_blank'
            return attrs

        content = '{}'.format(self.content.replace('\n', '<br/>'))

        # workaround to allow linkify localhost:8000
        content = content.replace('localhost:8000', 'dummy_site.ru')
        content = linkify(content, callbacks=[set_target, ])
        content = content.replace('dummy_site.ru', 'localhost:8000')

        return content
Примечание:
Чтобы долго не искать, как добавить target="_blank" ссылкам, я оставил callback set_target(attrs,...

Failed to establish a new connection: [Errno 111] Connection refused

Достаточно непросто сразу понять почему возникла ошибка Failed to establish a new connection: [Errno 111] Connection refused. В моём случае просто не хватило памяти для построения индекса. Соответственно, можно оптимизировать потребление памяти или увеличить ресурсы сервера.

Также может быть просто не запущен сервер elasticsearch. В этом случае можно воспользоваться командой service elasticsearch start.

Можно попробовать рестартнуть elasticsearch: service elasticsearch restart.

Также убедитесь, что вы добавили elasticsearch на автозагрузку (как это сделать на странице: )

Если не помогло, то уже можно смотреть конфиг /etc/elasticsearch/elasticsearch.yml. Опции не буду приводить: их много - можно почитать на официальном сайте:


django.core.urlresolvers.NoReverseMatch: Reverse for 'pages-details-by-slug'

Ошибка django.core.urlresolvers.NoReverseMatch: Reverse for 'pages-details-by-slug' может возникнуть при выполнении метода get_absolute_url() экземпляра класса Page из management команды. Дело в том, что когда вызывается management команда, page ничего не знает об используемом языке (language) и валится в следующем куске кода:

def get_absolute_url(self, language=None, fallback=True):
    if not language:
        language = get_language()  # автоматически не удаётся определить language
    with i18n.force_language(language):
        if self.is_home:
            return reverse('pages-root')
        path = self.get_path(language, fallback) or self.get_slug(language, fallback)
        return reverse('pages-details-by-slug', kwargs={"slug": path})  # и происходит ошибка, так как path не определился

Пример того, как можно установить язык:

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

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

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

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

Попробуйте

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