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

Пасиб. :) Понравилось.
PS. Убери у label'ов display: block
Полезная весчь. Но вот если бы ещё можно было как-то сделать кастомизацию list_filter, цены б не было. Вот я сейчас над этим долблюсь статьи к разделу категорий Статьи, а продукция к разделу категории Продукция. Ничего в голову не лезет. :) И всё таки сортировка в админке сделана через опу. Ну не выдаёт она так как мне надо. :)
Спасибо, отличная идея. Буду использовать.
Может быть она просто не для того предназначена?:) Ждать много от стандартного CRUD'a я бы не стал. Если не хватает функциональности, то нужно писать свой бекэнд.
А что не так? Просто верстка не мой конек:)
просто "Уведомлять о новых комментариях по почте" под чекбоксом не смотрится :)
Ну и для полного счастья я еще добавляю самую малость JavaScript 'a:
Ага, хорошая идея:)
А я просто перенаправляю на страницу удаления на <a href='%s/delete/'>delete</a> % self.id, а там уже оно спрашивает подтверждение. и не ставлю крестик удаления -- потому что с ним некрасиво получается, он в глаза сильно бросается, всё-таки строчка текста с единственной картинкой.
Кстати, да. У меня уже юрл-реверс мозг съел, поэтому я его всегда использую. А как вариант можно и относительный путить писать, так и джанго-девелоперы сами не брезгуют делать.
Ну это уже дело вкуса.:) Мне крестик не мешает да и как-то разбавляет он скучную картинку.
за статью спасибо, но джанговский стандартный вариант с точки зрения информационного дизайна более логичен. сценарий взаимодействия такой: вы смотрите список объектов, решаете что какой-то из них лишний, заходите посмотреть его параметры, ваша уверенность становится стопроцентной, вы удаляете объект. то есть вероятность того, что вы по ошибке что-то удалите сокращается и при этом нет необходимости использования дурацких диологов подтвеждения. хотя конечно время работы с системой существенно увеличивается (((
если развивать вашу идею дальше, то гораздо эффективней использовать массэкшены - чекбоксом выделяем нужные записи и затем производим с ними необходимое действие :)
в делишесы !
С чекбоксами конечно удобней. Но этот вариант требует более комплексного решения, чем написание одного метода модели:) Хотя в перспективе некое универсальное решение наверно можно найти. Но уж лучше подождать до того как newforms-admin сольется с транком.
Чекбоксы делаются очень просто:
вот и всё, осталось добавить на страницу кнопку Mass delete, поставить на неё перенаправление на нужный метод:
ну и нарисовать этот самый метод массового удаления объектов:
P.S. не удивлюсь, если есть баги, т.к. пишу по памяти. Кроме того, есть подобный snippet на djangosnippets.org. Как говорится, было бы желание :)
А как сделать эти удаления теперь, когда django.contrib.admin.views.main.delete_stage уже больше нет в транке?
Я на самом деле ещё не портировал это. Поэтому для начала можно просто вбить ссылку руками:)
Пока получается вот такая заплатка:
Заставить работать django.contrib.admin.site не удалось. Пробовал методы root и model_page.
Отформатировать текст не получилось :( Справка по markdown не работает.
Да, тоже вариант.
Кстати, могу посоветовать посмотреть django-batchadmin. Это приложение позволяет делать операции над множеством объектов сразу. Скоро его в джангу непосредственно встроят, так что возможно нет необходимости так шаманить вообще.
Спасибо, поправлю. У меня как раз скоро обновление движка:)
Этот django-batchadmin не решает всех подобных проблем. Я на предложенной в этой статье технологии цеплял сразу несколько функций к моделям. Причём не только для экземпляров, но и для класса. Например, ссылка на создание нового экземпляра (типа того, что джанго делает в админке вверху справа).
з.ы. Приведённый мною пример не работает, кстати. Другого варианта пока не нашёл.
Вы меня заинтересовали:-) Надо всё-таки выделить время и портировать это решение на текущую джангу.
Да-да, очень будет интересно посмотреть на результат :)