IT Блог

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

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

Не работает {% page_url %} в django cms

Когда перестаёт работать какой-нибудь django-cms тег (например {% page_url %}), проверьте передали ли вы context при рендере шаблона. Эту ошибку я описывал в статье . В ней эта ошибка более подробно расписана, и, чтобы не повторяться, я просто приведу пример правильного использования context для того, чтобы заработал рендер шаблона:

@register.inclusion_tag('quote.html', takes_context=True)
def get_quote(context):
    context['quote'] = Quote.objects.last()
    return context

И сам шаблончик quote.html:

{% load cms_tags %}

<blockquote>
    <p>{{ quote.text|linebreaksbr }}</p>

    {% page_url 'quote-authors' as quote_authors_url %}
    {% if quote_authors_url %}<a href="{{ quote_authors_url }}" class="author">{{ quote.author }}</a>
    {% else %}<p class="author">{{ quote.author }}</p>{% endif %}
</blockquote>

You must enable the 'sekizai.context_processors.sekizai'

Бывает странно видеть ошибку:

 TemplateSyntaxError: You must enable the 'sekizai.context_processors.sekizai' template context processor or use 'sekizai.context.SekizaiContext' to render your templates.

хотя и подключен context_processors:

TEMPLATES = [
    {
        'OPTIONS': {
            'context_processors': [
                ...
                'sekizai.context_processors.sekizai',
            ]
        },
    },
]

Такое может происходить, когда вы пытаетесь срендерить шаблон, в котором используются sekizai-теги, но не передали context, например, при использовании inclusion_tag. На этом этапе странность и пропадает - ведь действительно, sekizai нужен context.

Как вариант, можно использовать следующий пример включающего тега:

@register.inclusion_tag('quote.html', takes_context=True)
def get_quote(context):
    context['quote'] = Quote.objects.last()
    return context

takes_context=True - передаёт context в наш inclusion_tag, что...


Error fetching command 'graph_transitions': No module named graphviz

Попробуем исправить ошибку Error fetching command 'graph_transitions': No module named graphviz. Для запуска пакета graphviz нам нужен setuptools:

pip install setuptools

Теперь попробуйте снова поставить пакет pygraphviz командой pip install pygraphviz. Если появляется новая ошибка вроде этой:

    running install
    Trying pkg-config
    Package libcgraph was not found in the pkg-config search path.
    Perhaps you should add the directory containing `libcgraph.pc' to the PKG_CONFIG_PATH environment variable
    No package 'libcgraph' found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-ojXrMb/pygraphviz/setup.py", line 87, in <module>
        tests_require=['nose>=0.10.1', 'doctest-ignore-unicode>=0.1.0',],
        ....
    subprocess.CalledProcessError: Command '['pkg-config', '--libs-only-L', 'libcgraph']' returned non-zero exit status...

Подключение wi-fi адаптера WN727N на Linux. Установка драйвера Ralink MT7601

Вот и закончилась моя борьба по подключению wi-fi адаптера WN727N на Linux. Итог - победа :)

Что я только не пробовал, чтобы установить драйвер Ralink MT7601, который нужен для работоспособности wi-fi адаптера WN727N - у меня так и не получилось. Видимо, не хватает знаний в установке драйверов в текущее ядро Linux (может имеется какая-то специфика установки драйвера).

В итоге прочитал, что wi-fi адаптер стабильно работает на Linux с версией ядра 4.2 и выше, так как содержит драйвер Ralink MT7601 в своём составе. Поэтому, если вы не особо разбираетесь в том, как обновить ядро Линукса до нужной версии или как запустить...


Пример manage.py. Решение ошибки "check for SOUTH_DATABASE_ADAPTER[S] settings"

Известно, что начиная с Django 1.7 нет необходимости подключать South, так как в Django 1.7 добавили встроенную систему миграций. Но иногда при установке зависимостей какие-то зависимости всё ещё тянут за собой приложение South. И когда пытаешься запустить своё приложение, то debug ругается:

There is no South database module 'south.db.postgresql_psycopg2' for your database. Please either choose a supported database, check for SOUTH_DATABASE_ADAPTER[S] settings, or remove South from INSTALLED_APPS.

Отсюда видно, что South предлагает добавить параметр SOUTH_DATABASE_ADAPTERS, например так:

SOUTH_DATABASE_ADAPTERS = {
    'default': "south.db.postgresql_psycopg2"
}

Но к сожалению, это у меня данный параметр почему-то не работает. Тогда я пошёл...


Книга "Разверни сайт на Django"

Несколько лет назад я описывал, как развернуть сайт на Django, а теперь решил написать книгу "Разверни сайт на Django".

Автор книги "Разверни сайт на Django" Мальцев Артём ().


Error: SMTPRecipientsRefused 501 - sender address must match authenticated user

Разберём случай, когда мы пытаемся послать почту и получаем ошибку sender address must match authenticated user. Такая ошибка возникает, когда при отправке почты командой, например, send_mail указываешь адрес отправителя отличный от адреса, который указан при настройке подключения к SMPT серверу.

Ниже написанный код хорошо работает для меня:

# settings.py
EMAIL_HOST = 'smtp.mail.ru'
EMAIL_PORT = 2525
EMAIL_HOST_USER = "your@mail.ru"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True

SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER


# views.py (или другое место)
from settings import EMAIL_HOST_USER
send_mail('Тема', 'Тело письма', EMAIL_HOST_USER, ['to@example.com'], )

Импортируя EMAIL_HOST_USER из settings.py, я однозначно уверен, что у меня адрес отправителя письма...


Error: That port is already in use. Перезапустить порт 8000

Эта ошибка означает, что порт занят. Бывает, когда, например, в pycharm пытаешься перезапустить проект и терминал выдаёт Error: That port is already in use. Чтобы освободить порт 8000, помогает в консоли его сброс:

sudo fuser -k 8000/tcp

Если точнее, эта команда убивает все процессы, связанные с указанным портом.


Закрыть незакрытые теги. fix unclosed html tags python

Можно сделать так:

def tokenizer_html5lib(string):
    p = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom"))
    dom_tree = p.parseFragment(string)
    walker = treewalkers.getTreeWalker("dom")
    stream = walker(dom_tree)

    s = serializer.htmlserializer.HTMLSerializer(omit_optional_tags=False)
    return ''.join(s.serialize(stream))

tokenizer_html5lib('<div> test <p> p_test <span> some_test </p> quz </span> </div')

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


Добавить свои переменные в шаблоны админки. Изменить поведение view в админке django

Ниже я написал два примера, как можно изменить стандартное поведение представления в админке Django или как добавить свои данные в представление:

# admin.py
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = ('project', 'amount')
    list_filter = ('is_inner', )
    
    # 1-ый пример - ставим по умолчанию сортировку объекта по полю "is_inner__exact" в модели Order
    def changelist_view(self, request, extra_context=None):
        key = 'is_inner__exact'
        if key not in request.GET:
            q = request.GET.copy()
            q[key] = '0'
            request.GET = q
            request.META['QUERY_STRING'] = request.GET.urlencode()
        return super(OrderAdmin, self).changelist_view(request, extra_context=extra_context)

    # 2-ой пример - обрабатываем данные объекта, которого редактируем в админке
    def change_view(self, request, object_id, form_url='', extra_context=None):
        if object_id:
            extra_context = extra_context or...

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

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

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

Попробуйте

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