12 марта 2012 г.

Новинки Django 1.4, day 4: Админка

Сегодня настала очеред поведать про фичи версии 1.4, относящиеся к административному интерфейсу Django. Предыдущие части 0, 1, 2, 3.

HTML5 Doctype
Разработчики сменили доктайп с HTML 4.01 Transitional и XHTML 1.0 Strict на более современный так называемый “HTML5 doctype” с сокращённой записью <!DOCTYPE html>, который также заставляет современные браузеры рендерить страницы в “standards mode”, так что ничего особо нового, хотя шуму много и в чейнджлоге где-то вверху списка новшество.

Пользовательские фильтры в админке
 Начиная с версии 1.4 теперь официально задокументирован API по созданию пользовательских фильтров на страницах ChangeList с табличным представлением данных моделей. Ранее известный под именем FilterSpec, новый способ создания фильтров вполне себе приятен. Вот пример из доков с переведёнными комментариями:
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter
class DecadeBornListFilter(SimpleListFilter):
    # Человекопонятное название фильтра
    title = _('decade born')
    # Название пармаетра, корое будет фигурировать в урле
    parameter_name = 'decade'
    def lookups(self, request, model_admin):
        """
        Пары значение-заголовок для пользовательского фильтра
        """
        return (
            ('80s', _('in the eighties')),
            ('90s', _('in the nineties')),
        )
    def queryset(self, request, queryset):
        """
        Непосредственная фильтраций QuerySet 
        на основе взначения фильтра из self.value()
        """
        if self.value() == '80s':
            return queryset.filter(birthday__year__gte=1980,
                                    birthday__year__lte=1989)
        if self.value() == '90s':
            return queryset.filter(birthday__year__gte=1990,
                                   birthday__year__lte=1999)

class PersonAdmin(ModelAdmin):
    list_filter = (DecadeBornListFilter,)

Можно менять внешний вид фильтров посредством пользовательских шаблонов, динамически на основе запроса менять набор фильтров, возвращаемых функцией lookups. Стандартные фильтры типа BooleanFieldListFilter и DateFieldListFilter по-прежнему считаются "внутренним" API и не документируются, хотя никто не запрещает ими пользоваться на свой страх и риск:
class PersonAdmin(ModelAdmin):
    list_filter = (
        ('is_staff', BooleanFieldListFilter),
    )

Множественная сортировка в админке
Наконец-то стало возможно сортировать данные в ChangeList'е не только по одной колонке, а по нескольким сразу. Кроме стандартного атрибута ordering, можно задать пользовательскую сортировку через ModelAdmin.get_ordering() в зависимости от значения request или вручную через GUI. На скриншоте пример админки этого сайта (аж 4 сортировки в разных направлениях):


Новые методы ModelAdmin
Добавилось целых три метода:

ModelAdmin.save_related(self, request, form, formsets, change)
Позволяет добавить дополнительную обработку при сохранении формсетов с инлайнами после того, как родительская сущность сохранена. Метод дополняет существующие save_model() и save_formset(), позволяя вынести необхоимую пре- или пост-обработку в отдельный метод не хакая неподохдящие response_change() and response_add().

ModelAdmin.get_list_display(self, request)
ModelAdmin.get_list_display_links(self, request, list_display)
Кастомизация свойств list_dispaly и list_display_links на основе request. Например, так можно настроить разное количество колонок в зависимости от прав пользователя, получив доступ к переменной request.user.

Инлайны учитывают права пользователей
Теперь инлайны в админке разрешаю выполнять только те действия, на которых есть права у данного пользователя. Для редактирования M2M-связей используются права от связанной модели (если промеждуточная таблица создана автоматически и не имеет своих прав доступа). Ранее до 1.4 можно было редактировать любые сущности через inline-формы админки , даже если у вас не было на это прав (главное, чтобы были права на «родительскую» сущность).

ADMIN_MEDIA_PREFIX Deprecated
Добавлено
Опция ADMIN_MEDIA_PREFIX считается устаревшей и более не используется в админке для построения урлов к статике. Следуя изменениям в 1.3, связанными с появлением функциональности contrib.staticfiles, начиная с 1.4 теперь вместо ADMIN_MEDIA_PREFIX используется <STATIC_URL>/admin/. Это обратно несовместимое изменение, так что если у вас не был правильно настроен STATIC_URL и STATIC_ROOT на отдачу статики, либо вы отдавали статику админки по hardcoded-пути, стоит всё проверить перед апдейтом.

Продложение следует...
Осталось ещё несколько интересных тем, которые мы раскроем в ближайшие дни, вероятно, даже до релиза.

Комментариев нет:

Отправить комментарий