06:20 2020/09/08

Django-админка одного экземпляра

Иногда в Django-админке требуется создать и редактировать только один экземпляр модели. Соответственно, когда объект уже создан, то выводить форму добавления не нужно. Заодно следует запретить создание нового экземпляра, если пользователь все-же попадет на страницу с формой добавления.

Сперва, кажется, что все слишком просто. Проблема решается добавлением метода has_add_permission

Но теперь, чтобы добраться до формы изменения объекта, нужно будет перейти сначала в список, содержащий всего один экземпляр, что довольно-таки бессмысленное занятие. Хорошо бы избавится от этого новообразовавшегося микротаймкиллера. Тут еще и название модели во множественном числе никуда не годится, что за кривой русский: «Выберите Настройка сайта для изменения»? Это тоже поправимо, но сейчас задача состоит в том, чтобы совсем не попадать на эту страницу.


Список для одного экземпляра

Для этого придется создать свой класс AdminSite и нагородить в нем методов. Пример, опять же только для модели Config. Только для нее прописываем ссылку на редактирование, а не на вывод списка, остальные модели останутся как есть - со списком.

Теперь нужно не забыть прописать в urls.py экземпляр новой админки вместо стандартного. И, конечно, в admin.py прописать тоже свой admin_site.


Дополнительный штрих - скрываем кнопку "Сохранить и продолжить редактирование" и всегда при сохранении возвращаемся обратно на форму.

Что может пойти не так?
Когда есть админка одного экземпляра модели, есть некоторая вероятность, что может произойти появление еще одного экземпляра и тогда ссылка в админке может вести совсем не на тот экземпляр, что ожидается.
Подстраховаться от этого можно просто добавив сортировку по умолчанию в модели, например, по идентификатору. В этом случает запрос .first() будет вести всегда на одну и ту же запись.

Также, с момента создания своего AdminSite надо будет всегда явно добавлять админки из сторонних пакетов, что в принципе, неплохо. Порой совсем не ждешь появление свежедобавленного раздела на главной странице админки при установке очередного пакета. Поэтому, если будет нужно - всегда можно добавить, а если даже не заметил, что для какой-то модели админки нет, то она и не нужна.