Посты с тэгом admin


Admin actions в качестве views с промежуточной формой

Полезность admin actions в django трудно переоценить. До версии 1.1 этого механизма в django не было и как только не приходилось извращаться даже для самых элементарных задач вроде удаления группы записей.

Обычно admin action просто молча выполняет операцию над группой записей и пользователь возвращается обратно к списку объектов. Однако есть мало известная, хотя и документированная, возможность не бросать пользователя в changelist, а вернуть какой-нибудь HttpResponse. К примеру перед обработкой переданных записей мы можем вывести форму с дополнительным вопросом о параметрах обработки.

Документация в качестве примера предлагает возвращать HttpResponseRedirect и передавать список обрабатываемых объектов в виде GET-параметра полноценной view дл



Использование sorl.thumbnail без template tags

Практически в каждом django-проекте рано или поздно встает вопрос о генерировании превьюшек для картинок. Одним из наиболее простых и удобных решений для этого является sorl.thumbnail. Это приложение позволяет генерировать превьюшки либо прямо в шаблоне через тег {% thumbnail %}, либо используя в моделях специальное поле sorl.thumbnail.ImageField.

В подавляющем большинстве случаев этого достаточно, но иногда возникает необходимость получить превьюшку в python-коде прямо по месту, без переделывания моделей.

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

from django.utils.html import format_html
from sorl.thumbnail import get_th


How to limit number of admin inline formset entries

Привет всем, в кои-то веки сподобился написать о Django.

Причём не общий пост, а решение конкретной мелкой задачки.

Итак, задача: Нужно ограничить количество записей в InlineModelAdmin.

Решение: По историческим причинам, иерархия классов в Django сильно различается для ModelAdmin и InlineModelAdmin:

Model <-(has)<- ModelAdmin ->(has)-> queryset

, но

Model <-(has)<- InlineModelAdmin ->(has)->
-> formset = BaseInlineFormSet ->(has)-> get_queryset

Итого:

class MyBaseInlineFormSet(BaseInlineFormSet):
    def get_queryset(self):
        sup = super(MyBaseInlineFormSet, self).get_queryset()
        return sup.order_by('-id')[:5]

reg_inline(A, B, formset = MyBaseInlineFormSet, extra = 5)

Где reg_inline это упрощенный способ сделать site.register с помощью моего



Admin actions в качестве views

Долгое время в джанговской админке не было встроенной поддержки для массовых действий над записями. К примеру как только не приходилось извращаться для хотя бы чуть более удобного удаления объектов.

В версии 1.1 джангонавтам привалило счастье - групповые операции. Удаление кучки объектов теперь есть прямо из коробки. При этом, как обычно это бывает в django, использовать новый механизм легко и приятно - написание простенького action укладывается в две-три строчки. Больше того, action может не только как-то молча обрабатывать группу объектов, но и возвращать HttpResponse, в котором пользователь может проделать дополнительные действия.

Документация в качестве примера предлагает



Использование sorl.thumbnail без template tags

Практически в каждом django-проекте рано или поздно встает вопрос о генерировании превьюшек для картинок.  Одним из наиболее простых и удобных решений для этого является sorl.thumbnail.  Это приложение позволяет генерировать превьюшки либо прямо в шаблоне через тег {% thumbnail %}, либо используя в моделях специальное поле ImageWithThumbnailsField.  В подавляющем большинстве случаев этого достаточно, но иногда возникает необходимость получить превьюшку в python-коде прямо по месту, без переделывания моделей.

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

class PatternAdmin(admin.ModelAdmin):
    list_display = ('icon', '__unicode__',)
    list_display_links = ('__unicode__',)

    def icon(self, obj):
        from sorl.thumbnail.main import DjangoThumbnail
        thumbnail = DjangoThumbnail(obj.photo,