17 ноября 2012 г.

django: пролучить комментарии для объекта

Комментарии в django.contrib.comments, как известно, привязаны к моделям приложений через джанговский contenttypes. В документации рассказано как отрендерить и получить список в шаблонах, но механизм работы более подробно не рассмотрен для того, чтобы работать с комментариями в своих вьюшках. Ничего тут сложного нету, можно получить ContentType и вытащить все комментарии, но есть более удобный метод:
from django.contrib.comments.models import Comment

project_comments = Comment.objects.for_model(Project).filter(object_pk=project.id)
Его тоже можно разглядеть и изучить в исходниках django. Короче, с помощью for_model у CommentManager можно покороче и поудобнее сделать это всё. Содержимое метода вполне очевидно:
def for_model(self, model):
    """
    QuerySet for all comments for a particular model (either an instance or a class).
    """
    ct = ContentType.objects.get_for_model(model)
    qs = self.get_query_set().filter(content_type=ct)
    if isinstance(model, models.Model):
        qs = qs.filter(object_pk=force_unicode(model._get_pk_val()))
    return qs
Также можно обратить внимание, что если есть возможность, то можно передать не модельку, а конкретный экземпляр, тогда фильтровать по object_pk не придётся.

9 октября 2012 г.

django формы ChoiceField пустой выбор

Как ни странно, на данный момент у ChoiceField нет возможности из формы запросто задать пустой вариант выбора, как, например, у ModelChoiceField. Мелкая обёртка на скорую руку делает это аналогично тому, как это работает в ModelChoiceField.
from django import forms

class EmptyChoiceField(forms.ChoiceField):
    def __init__(self, choices=(), empty_label=u"---------", required=True, *args, **kwargs):
        # если не required и указана empty_label
        if not required and empty_label is not None:
            choices = tuple([(u'', empty_label)] + list(choices))
        super(EmptyChoiceField, self).__init__(choices=choices, required=required, *args, **kwargs)

14 сентября 2012 г.

eclipse pydev ImportError: Could not import settings

Ещё один косяк после рефакторинга проекта и перевода его на django 1.4. Ни в какую не стартует сервер из manage.py из самого eclipse. Бился-бился, всё равно пишет:
ImportError: Could not import settings 'project-django.settings' (Is it on sys.path?): No module named project-django.settings
И пути прописывал и всё остальное. Что характерно, извне эклипса, из консоли, всё отлично поднимается. Создал новый проект, запускаю — запускается. Начал разбираться — всё одинаковое в настройках проектов. Ничего не пойму.

django: ImproperlyConfigured Error importing authentication backend

Столкнулся с дурацкой непонятной ошибкой после большого рефакторинга проекта.

ImproperlyConfigured at /
Error importing authentication backend app.auth_backends.CustomUserModelBackend: "No module named app.auth_backends"

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

30 мая 2012 г.

openbox и lxde на arch linux (черновикъ и всякие фишки)

Однажды я ударился головой в сильный минимализм и решил делать очень тонкую систему (на WM openbox, панельке tint2, и всякой другой босоте), потом постепенно пришёл к компромиссу — LXDE, которая тоже использует по умолчанию openbox, плюс свою довольно приличную панельку lxpanel и прочие lx-плюшки, обладающие для меня на данный момент идеальным балансом минимализм-юзабельность. Тут последовательно в виде мелких исторических заметок.

25 мая 2012 г.

Делаем скриншоты в LXDE/openbox кнопкой

В openbox/lxde нет родного способа снять скриншот, а мне этого так не хватало. Имеется способ снятия через утилиту import, входящую в состав imagemagick. Сначала вешаем на обычные кнопкосочетания PrtScr (снять весь экран) и Alt+PrtScr (снять текущее окно) вызовы скриптов. Для этого прописываем в ~/.config/openbox/lxde-rc.xml (для openbox в составе lxde) в секцию <keyboard>:

22 мая 2012 г.

linux: почему же ELF interpreter в Arch Linux 64 линкуется в /lib

Как-то однажды я собрал программу в своём 64-битном Arch Linux и отдал бинарник, а оно берёт и не работает. Пишет:
/lib/ld-linux-x86-64.so.2: bad ELF interpreter: Нет такого файла или каталога
Ну, долго тут думать не пришлось — оказался странным путь для ld-linux-x86-64. Я не понял как оно должно быть по LSB, но во всех тестируемых системах ld-linux-x86-64.so.2 ищется в /lib64.
Fedora 17:
$ whereis ld-linux-x86-64.so.2
ld-linux-x86-64.so: /lib64/ld-linux-x86-64.so.2 /usr/lib64/ld-linux-x86-64.so.2
Arch Linux:
$  whereis ld-linux-x86-64.so.2
ld-linux-x86-64.so: /lib/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
В генту lib это ссылка на lib64.
Причём, в арче в lib64 кроме двух ссылок на соответствующие файлы в lib больше ничего нет:
$ ls /lib64
ld-2.15.so  ld-linux-x86-64.so.2