Передо мной стояла задача гибко расширить функционал стандартной админки джанги.
Вьюшка таблицы
Рассмотрим добавление дополнительного действия в лист, на примере пользователей. Стандартный пример — выгрузка пользователей в Exel. Вы видим обычный лист с дефолтными действиями.
![](https://dzen-code.ru/wp-content/uploads/2022/08/4A895EF2-1660-49B5-838A-1BCEA1758AC4.jpg)
Добавим небольшой HTML в шапку. Для этого в admin.py нашего модуля добавим дополнительный класс, который будет переопределять отображение модели в админке.
from django.contrib import admin
from django.contrib.auth.models import User
#Переопределяем вывод модели Юзеров
class CustomAdminUsers(admin.ModelAdmin):
readonly_fields = ['address_report']
list_display = ('first_name', 'email', 'is_active', 'date_joined', 'last_login',)
# определяем дополнительный темплейт
change_list_template = "admin/user_profile_templ.html"
admin.site.unregister(User)
admin.site.register(User, CustomAdminUsers)
change_list_template — собственно директива определяющая дополнительный шаблон.
Он находится по пути yourmodule/static/templates/admin
![](https://dzen-code.ru/wp-content/uploads/2022/08/08C97E1D-C63E-4F47-A9A9-5B98256C90BA.jpg)
Сам шаблон. В нем форма и указанный экшн.
{% extends 'admin/change_list.html' %}
{% block object-tools %}
<form action="to-exel/" method="POST">
{% csrf_token %}
<input class="exel-btn" type="submit" value="Выгрузить в Exel"/>
</form>
{{ block.super }}
{% endblock %}
Отлично у нас отобразился шаблон.
![](https://dzen-code.ru/wp-content/uploads/2022/08/A88B0177-B79D-465B-BC77-416C79F94526.jpg)
Теперь нужно обработать экшн а admin.py в нашем классе.
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib import messages # сообщения джанги
#Переопределяем вывод модели Юзеров
class CustomAdminUsers(admin.ModelAdmin):
readonly_fields = ['address_report']
list_display = ('first_name', 'email', 'is_active', 'date_joined', 'last_login',)
change_list_template = "admin/user_profile_templ.html" # определяем дополнительный темплейт
# Определяем дополнительные урлы (код сам взял из stackoverflow)
def get_urls(self):
urls = super(CustomAdminUsers, self).get_urls()
custom_urls = [url('^to-exel/$', self.to_exel, name='to_exel'), ]
return custom_urls + urls
# На обработчик
def to_exel(self, request):
# логика экшена
messages.success(request, f"Пользователи успешно выгружены")
return HttpResponseRedirect("../")
admin.site.unregister(User)
admin.site.register(User, CustomAdminUsers)
Собственно все для вьюшки листа.
Вьюшка редактирования модели
Теперь выведем дополнительную информацию в самой странице редактирования. Тут еще быстрее и проще. Ставим поле в readonly. И определяем функцию вывода. Либо текст, либо любой html. Соответсвенно можно брать любую информацию из других моделей и преобразовывать в нужный контент.
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib import messages # сообщения джанги
from django.utils.html import format_html
#Переопределяем вывод модели Юзеров
class CustomAdminUsers(admin.ModelAdmin):
readonly_fields = ['some_content']
list_display = ('first_name', 'email', 'is_active', 'date_joined', 'last_login',)
change_list_template = "admin/user_profile_templ.html" # определяем дополнительный темплейт
# Дополнительный контент
def some_content(self, instance):
return format_html("<a href='%s'>%s</a>" % ('somelink.ru', 'Пример ссылки'))
# Определяем дополнительные урлы (код сам взял из stackoverflow)
def get_urls(self):
urls = super(CustomAdminUsers, self).get_urls()
custom_urls = [url('^to-exel/$', self.to_exel, name='to_exel'), ]
return custom_urls + urls
# На обработчик
def to_exel(self, request):
# логика экшена
messages.success(request, f"Пользователи успешно выгружены")
return HttpResponseRedirect("../")
admin.site.unregister(User)
admin.site.register(User, CustomAdminUsers)
Получаем результат в конце после редактируемых полей.
![](https://dzen-code.ru/wp-content/uploads/2022/08/D2E0ABF9-4658-4186-BD04-04E736977964.jpg)