Django добавление кастомного контента и действий в админку(Django add custom actions and content in admin view)

58
0
58

Передо мной стояла задача гибко расширить функционал стандартной админки джанги.

Вьюшка таблицы

Рассмотрим добавление дополнительного действия в лист, на примере пользователей. Стандартный пример — выгрузка пользователей в Exel. Вы видим обычный лист с дефолтными действиями.

Добавим небольшой 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

Сам шаблон. В нем форма и указанный экшн.

{% 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 %}

Отлично у нас отобразился шаблон.

Теперь нужно обработать экшн а 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)

Получаем результат в конце после редактируемых полей.

0