Александр Кошелев
Александр Кошелев Python-разработчик

Чуть более быстрое удаление объектов в админке

И опят речь пойдет об оптимизации, но оптимизации не программной части сайта, а работы человека с сайтом. Вас никогда не напрягало то, что в штатной джанговской админке для того чтобы удалить объект, нужно выбрать его из списка, потом прокрутить страницу внизу и нажать на кнопку “Удалить”?

Меня вот это раздражало, пока мне не пришла в голову простая идея. Надо кнопку удаления сделать в list view в каждой строчке.

Решение ещё проще чем идея.:) Вот пример:

class Entry( models.Model ):
    value = models.IntegerField()

    #начинается самое интересное. внимание
    def remove(self):
        from django.core.urlresolvers import reverse
        return '<a href="%s" class="deletelink">Delete</a>'\
                   % reverse( "django.contrib.admin.views.main.delete_stage",
                                        args=(self.__class__._meta.app_label,
                                             self.__class__.__name__.lower(),
                                             self._get_pk_val(),) )
    remove.allow_tags = True
    #интересное почти кончилось

    class Admin:
        list_display = ( "value", "remove" )

Вот такой результат:

delete buttons

Просто, не правда ли? Немного расскажу про код на всякий случай. Вся соль в возможности указывать в list_display не только реальные поля, но и методы модели. Так же эти методы можно помечать атрибутом allow_tags чтобы возвращаемое значение не эскейпилось автоматически. Метод сам по себе тривиален - возвращает тег-ссылки на страницу удаления. Ссылка получается через реверс с нужными параметрами.

Нужно всего-лишь добавить такой метод в модель и прописать его в list_display. Можно немного доработать и сделать базовый класс с этим методом, а потом от него наследовать нужные модели. Так же можно Delete вынести как параметр форматирования и обернуть его в _(), чтобы сохранилась возможность перевода в соответствии с языковыми настройками. Так что простор для творчества большой. Я лишь предложил концепцию:)

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

Как думаете, поможет в работе с админкой такой трюк? Я пока испытываю только положительные эмоции. Менеджеры моих проектов скоро тоже оценят, я думаю…:)

P.S: прошу прощения у читателей за долгое молчание, просто сейчас нахожусь в стадии “суровой сессии” и времени катастрофически не хватает. Обещаю скоро исправиться:)

comments powered by Disqus