И опят речь пойдет об оптимизации, но оптимизации не программной части сайта, а работы человека с сайтом. Вас никогда не напрягало то, что в штатной джанговской админке для того чтобы удалить объект, нужно выбрать его из списка, потом прокрутить страницу внизу и нажать на кнопку "Удалить"?
Меня вот это раздражало, пока мне не пришла в голову простая идея. Надо кнопку удаления сделать в 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" )
Вот такой результат:

Просто, не правда ли? Немного расскажу про код на всякий случай. Вся соль в возможности указывать в list_display не только реальные поля, но и методы модели. Так же эти методы можно помечать атрибутом allow_tags чтобы возвращаемое значение не эскейпилось автоматически. Метод сам по себе тривиален - возвращает тег-ссылки на страницу удаления. Ссылка получается через реверс с нужными параметрами.
Нужно всего-лишь добавить такой метод в модель и прописать его в list_display. Можно немного доработать и сделать базовый класс с этим методом, а потом от него наследовать нужные модели. Так же можно Delete вынести как параметр форматирования и обернуть его в _(), чтобы сохранилась возможность перевода в соответствии с языковыми настройками. Так что простор для творчества большой. Я лишь предложил концепцию:)
Вообще о такой возможности я знал давно. Всякие превьюшки картинок и результаты мудреных запросов успешно выводил. Но чтобы приклеить некое действие, как-то раньше не приходило в голову. Сейчас уже есть другие идеи и варианты использования, которые помогут расширить возможности стандартной админки.
Как думаете, поможет в работе с админкой такой трюк? Я пока испытываю только положительные эмоции. Менеджеры моих проектов скоро тоже оценят, я думаю...:)
P.S: прошу прощения у читателей за долгое молчание, просто сейчас нахожусь в стадии "суровой сессии" и времени катастрофически не хватает. Обещаю скоро исправиться:)
Комментарии 20
Пасиб. :) Понравилось.
PS. Убери у label'ов display: block
Оставлен 15 Январь 2008 в 22:05 ¶Полезная весчь. Но вот если бы ещё можно было как-то сделать кастомизацию list_filter, цены б не было. Вот я сейчас над этим долблюсь статьи к разделу категорий Статьи, а продукция к разделу категории Продукция. Ничего в голову не лезет. :) И всё таки сортировка в админке сделана через опу. Ну не выдаёт она так как мне надо. :)
Оставлен 16 Январь 2008 в 10:06 ¶Спасибо, отличная идея. Буду использовать.
Оставлен 16 Январь 2008 в 19:06 ¶Может быть она просто не для того предназначена?:) Ждать много от стандартного CRUD'a я бы не стал. Если не хватает функциональности, то нужно писать свой бекэнд.
Оставлен 17 Январь 2008 в 19:21 ¶А что не так? Просто верстка не мой конек:)
Оставлен 17 Январь 2008 в 19:22 ¶просто "Уведомлять о новых комментариях по почте" под чекбоксом не смотрится :)
Оставлен 17 Январь 2008 в 22:07 ¶Ну и для полного счастья я еще добавляю самую малость JavaScript'a:
Оставлен 20 Январь 2008 в 13:29 ¶Ага, хорошая идея:)
Оставлен 20 Январь 2008 в 13:42 ¶Кстати, да. У меня уже юрл-реверс мозг съел, поэтому я его всегда использую. А как вариант можно и относительный путить писать, так и джанго-девелоперы сами не брезгуют делать.
Ну это уже дело вкуса.:) Мне крестик не мешает да и как-то разбавляет он скучную картинку.
Оставлен 22 Январь 2008 в 02:30 ¶за статью спасибо, но джанговский стандартный вариант с точки зрения информационного дизайна более логичен. сценарий взаимодействия такой: вы смотрите список объектов, решаете что какой-то из них лишний, заходите посмотреть его параметры, ваша уверенность становится стопроцентной, вы удаляете объект. то есть вероятность того, что вы по ошибке что-то удалите сокращается и при этом нет необходимости использования дурацких диологов подтвеждения. хотя конечно время работы с системой существенно увеличивается (((
если развивать вашу идею дальше, то гораздо эффективней использовать массэкшены - чекбоксом выделяем нужные записи и затем производим с ними необходимое действие :)
С чекбоксами конечно удобней. Но этот вариант требует более комплексного решения, чем написание одного метода модели:) Хотя в перспективе некое универсальное решение наверно можно найти. Но уж лучше подождать до того как newforms-admin сольется с транком.
Оставлен 01 Февраль 2008 в 20:03 ¶Чекбоксы делаются очень просто:
вот и всё, осталось добавить на страницу кнопку Mass delete, поставить на неё перенаправление на нужный метод:
ну и нарисовать этот самый метод массового удаления объектов:
P.S. не удивлюсь, если есть баги, т.к. пишу по памяти. Кроме того, есть подобный snippet на djangosnippets.org. Как говорится, было бы желание :)
А как сделать эти удаления теперь, когда django.contrib.admin.views.main.delete_stage уже больше нет в транке?
Оставлен 31 Октябрь 2008 в 11:10 ¶Я на самом деле ещё не портировал это. Поэтому для начала можно просто вбить ссылку руками:)
Оставлен 02 Ноябрь 2008 в 20:09 ¶Пока получается вот такая заплатка:
Заставить работать django.contrib.admin.site не удалось. Пробовал методы root и model_page.
Оставлен 04 Ноябрь 2008 в 10:41 ¶Отформатировать текст не получилось :( Справка по markdown не работает.
Оставлен 04 Ноябрь 2008 в 16:42 ¶Да, тоже вариант.
Кстати, могу посоветовать посмотреть django-batchadmin. Это приложение позволяет делать операции над множеством объектов сразу. Скоро его в джангу непосредственно встроят, так что возможно нет необходимости так шаманить вообще.
Спасибо, поправлю. У меня как раз скоро обновление движка:)
Оставлен 04 Ноябрь 2008 в 20:12 ¶Этот django-batchadmin не решает всех подобных проблем. Я на предложенной в этой статье технологии цеплял сразу несколько функций к моделям. Причём не только для экземпляров, но и для класса. Например, ссылка на создание нового экземпляра (типа того, что джанго делает в админке вверху справа).
з.ы. Приведённый мною пример не работает, кстати. Другого варианта пока не нашёл.
Оставлен 05 Ноябрь 2008 в 18:55 ¶Вы меня заинтересовали:-) Надо всё-таки выделить время и портировать это решение на текущую джангу.
Оставлен 06 Ноябрь 2008 в 00:46 ¶Да-да, очень будет интересно посмотреть на результат :)
Оставлен 10 Ноябрь 2008 в 19:07 ¶Оставьте комментарий