Статья Создание страницы для команды Django

Admin

Администратор

Создание страницы для команды Django​


Создание страницы для команды Django

У ModelAdmin есть поле action_form, которое отвечает за вид формы для комманд на странице списка моделей. А вот как настроить страницу подтверждения перед выполнением команды? Как, например, у команды удаления.

Допустим, у нас есть модель с внешней ссылкой, и мы хотим сделать команду группового изменения этой ссылки. Открыл страницу со списокм моделей, выбрал нужные объекты, выбрал команду change_parent, открылась страница выбора нового parent из набора возможных вариантов. Выбрал. Сохранил. Профит. Плюс еще возможность сбросить parent установив None.

Начнем с создания django action.

Python:
@admin.register(models.Location)
class LocationAdmin(admin.ModelAdmin):

    # Тут какой-то еще код настройки админки ...

    # Добавляем новый action на страницу списка моделей.
    actions = ['change_parent']

    # Указанные тут action доступны только текущей моделе.
    # Еще есть глобальный список actions,
    # которые отображаются для всех моделей.

    # Функция action принимает запрос и список выбранных объектов.
    def change_parent(self, request, queryset):

        # Функция будет вызвана минимум дважды.
        # Один раз со страницы списка моделей, второй раз с нашей страницы.
        # И нам нужно как-то отличить эти запросы. Например,
        # через наличие маркера в POST параметрах.
        # Если в POST есть ключ apply, то это наша форма.
        if 'apply' in request.POST:

            # Чтобы не писать много всяких условий на различные
            # проверки пользовательского ввода, обернем все в try,
            # а все тесты должны бросать исключение.
            try:

                # Если форма наша, то в параметре new_parent будет натуральное число.
                # Из формы же приходит строка. если строку возможно переделать в int,
                new_parent = int(request.POST['new_parent'])
                # то все будет хорошо, иначе будет исключение.

                # Теперь нужно проверить значение параметра.
                # 0 у нас будет зарезервировано для сброса значения.
                # Тогда если new_parent положительное число,
                if new_parent > 0:

                    # то попробуем найти объект в базе данных с таким первичным ключем.
                    new_parent = models.Location.objects.get(pk=new_parent)

                    # И если нашли, то подготовим сообщение об успехе.
                    message = "Location {} set as new parent on {} Locations".format(
                        new_parent, queryset.count())

                    # А если не найдет, то будет ошибка и мы перейдем в блок except.

                else:
                    # Если new_parent равен нулю (или меньше), то
                    # это значит, что пользователь хочет его убрать.
                    new_parent = None
                    message = "Parent set empty on {} Locations".format(queryset.count())

            except Exception:

                # Если что-то пойдет не так, то нужно показать в логе исключение,
                traceback.print_exc()
                # а для пользователя сделать вид, что ничего не произошло.
                message = "Parent not found!"

            else:
                # А если не было исключений, то выполним полезную нагрузку.
                queryset.update(parent=new_parent)

            # И отправим пользователю сообщение с информацией о результате.
            self.message_user(request, message)
            # И редирект на страницу списка моделей.
            return HttpResponseRedirect(request.get_full_path())
      
        # А вот если apply нет в данных пост запроса,
        # то нужно сформировать форму для пользователя.
        # Чтобы выбрать новый parent.
        context = {

            # Так как мы вотрглись в процесс между отправкой команды
            # и ее фактическим выполнением, то нужно отрисовать на форме,
            # список выбранных пользователем объектов.

            # Поэтому queryset отправляется в контекст.
            'queryset': queryset,

            # Еще нужен набор объектов для нового parent.
            # Да, Я просто выплевываю все и да, так делать плохо.
            # Не делайте так.
            'objects': models.Location.objects.all(),

            # Все что ниже нужно джанге, чтобы найти этот метод,
            # когда пользователь нажмет на кнопку.
            'index': request.POST['index'],
            'action': request.POST['action'],
            'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,

        }

        # И отдаем контекст вместе с формой.
        return TemplateResponse(
            request, 'admin/change_parent_intermediate.html', context=context)

Для команды нужно добавить новый админский шаблон себе в templates/admin. Этот шаблон будет показывать форму выбора нового parent. И отправлять сделанный выбор обратно в команду.

HTML:
{# Расширяем какой-то админский шаблон #}
{% extends "admin/base_site.html" %}

{% block content %}

{# А вот и объявление нашей формы. Параметр action пустой - это означает, что #}
{# запрос будет отправлен на урл из адресной строки. #}
<form action="" method="post">
  {% csrf_token %}

{# Попытка объяснить пользователю, что происходит #}
  <p>Choice new parent for selected Locations:</p>
  <p>

{# Описываем select, который заполнит поле new_parent.#}
      <select name="new_parent">

        {# 0 - зарезервирован для установки пустого значения. #}
        <option value="0" selected>empty</option>

        {% for obj in objects %}
            <option value="{{ obj.id }}">{{ obj }}</option>
          {% endfor %}

      </select>
  </p>

{# Свое сделали, а теперь нужно поместить поля, которые нужны, #}
{# чтобы ModelAdmin смог найти нужный action #}
{# и передать в него выбранные пользователем ранее объекты. #}

{# Для этого и нужен был queryset в контексте. #}
  {% for obj in queryset %}
    <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk }}">
  {% endfor %}

{# И поля, указывающие на выбранный пользователем action. #}
  <input type="hidden" name="index" value="{{ index }}" />
  <input type="hidden" name="action" value="{{ action }}" />

{# Кнопке нужно дать имя маркера, который указывали в action. #}
  <input type="submit" name="apply" value="Set selected as new parent"/>

</form>
{% endblock %}


И это все что нужно.
 
Похожие темы
I Создание зеркал сайтов, клонирование страницы входа Уязвимости и взлом 0
Admin Статья Пароли. Создание и хранение. Анонимность и приватность 0
Admin Статья Создание поддельной точки доступа (fake access point) Полезные статьи 0
Admin Статья LLM-Polymorphism: Создание самоизменяющегося кода с помощью нейросетей. Вирусология 0
wrangler65 Создание Powershell Shellcode Downloader для обхода Defender Ч.2 Полезные статьи 0
wrangler65 Создание Powershell Shellcode Downloader для обхода Defender (Без обхода Amsi) Полезные статьи 0
wrangler65 Создание незаметного вредоносного ПО Ч.2 Полезные статьи 0
wrangler65 Интересно Создание незаметного вредоносного ПО для Windows (C2-фреймворк Villain + обфускация PowerShell + недетектируемая доставка) Полезные статьи 0
Support81 Цифровая угроза нового уровня: США обсуждают создание отдельного киберподразделения Новости в сети 0
W Разработка софта, администрирование | Создание Ботов, Парсеров, обход CAPTCHA, автоотрисовщики Ищу работу. Предлагаю свои услуги. 0
G Создание | Сайтов | Ботов | Скриптов| Лендинга | Программирование 0
SKYLL На проверке Создание сайтов/ботов разной сложности Ищу работу. Предлагаю свои услуги. 1
N Создание фейка Предоставляю работу. Ищу специалиста. 1
L ✔️ УДАЛЕНИЕ НЕГАТИВНОЙ ИНФОРМАЦИИ | УДАЛЕНИЕ СТАТЕЙ | ВИДЕО YOUTUBE | СОЗДАНИЕ РЕПУТАЦИИ | ДИСКРЕДИТАЦИЯ | КОМПРОМАТ | ОТЗЫВЫ | ЭКСКЛЮЗИВ Ищу работу. Предлагаю свои услуги. 11
DOMINUS Полиция задержала 18 человек за создание финансовой пирамиды Новости в сети 0
Q QUALITY ABSOLUTE SERVICE - СОЗДАНИЕ СЕРВИСОВ С ГОТОВЫМ САЙТОМ / БОТОВ / СОФТОВ / СКРИПТОВ Услуги дизайнеров и веб-разработчиков. 1
Q ♥️ ФОТОШОП / СОЗДАНИЕ ЛОГОТИПОВ / СЕРВИСОВ С ГОТОВЫМ САЙТОМ Ищу работу. Предлагаю свои услуги. 1
DOMINUS Создание резервной копии реестра Свободное общение 0
С Создание и размещение тем на 700+ форумах (увеличение клиентов до 50%) Услуги дизайнеров и веб-разработчиков. 1
adflak Создание, разработка, продвижение мобильных приложений в Иркутске iOS/Android заказать! Ищу работу. Предлагаю свои услуги. 0
S Рассылка на форумах и телеграмм чатах/создание и ведение аккаунтов Ищу работу. Предлагаю свои услуги. 1
Y Пароли. Создание и хранение Полезные статьи 3
Admin Интересно Создание своего Shadowsocks + v2ray + tor [Часть 2] Анонимность и приватность 5
Admin Интересно Создание своего Shadowsocks и обфускация трафика [Часть 1] Анонимность и приватность 2
C [CodePrasya]- Создание сайтов, софта любых сложностей|| Website development, software of any complexity. Ищу работу. Предлагаю свои услуги. 10
Y Hyper-V. Создание большого количества виртуальных машин Полезные статьи 0
A Создание сайтов Предоставляю работу. Ищу специалиста. 0
E Интересно Wi-Fi перехватчик данных( создание точки доступа ) Уязвимости и взлом 7
R Продам Создание сайтов Услуги дизайнеров и веб-разработчиков. 0
S Качественные услуги по веб-программированию: создание, обслуживание, поддержка и доработка сайтов Услуги дизайнеров и веб-разработчиков. 1
B Создание и раскрутка телеграм каналов. Полный гайд (2020) Готовый софт 0
B Создание чат-ботов без программирования за 1 час Готовый софт 0
B ⭐️СОЗДАНИЕ ВИДЕО ОТЗЫВОВ НА ЗАКАЗ!⭐️ Ищу работу. Предлагаю свои услуги. 1
ev0117434 Интересно Создание вредоносных QR-кодов для взлома телефонов и других устройств Уязвимости и взлом 11
P Проверено Создание HTML-писем/Рандомизация текста | Creating HTML-letters/Text Randomization Услуги дизайнеров и веб-разработчиков. 0
D Создание аккаунта Предоставляю работу. Ищу специалиста. 0
АнАлЬнАя ЧуПаКаБрА INLINE Создание лендингов.(RU) Готовый софт 0
T Пошаговое создание своего Bootkit'a [ЧАСТЬ 2] Программирование 0
T Пошаговое создание своего Bootkit'a [ЧАСТЬ 1] Программирование 4
K Курс «Создание чат-ботов без программирования за 1 час» Раздачи и сливы 1
K MySQL 5. Проектирование и создание баз данных для web Раздачи и сливы 0
G СОЗДАНИЕ ФАЙЛОВ, КОТОРЫЕ НЕ МОГУТ БЫТЬ НАЙДЕНЫ С ПОМОЩЬЮ ПАПКИ “...” Полезные статьи 0
G Создание цепочки из нескольких SHH Полезные статьи 0
АнАлЬнАя ЧуПаКаБрА [Private Keeper] Ebay Рег Чекер | Проект для создание SHOP заточек Готовый софт 0
G Создание собственных (элитных) дешевых прокси под свои дела Полезные статьи 4
C Создание сетевого червя Свободное общение 3
S Создание сайта в сети TOR Программирование 1
T Создание портативных программ Полезные статьи 0
S создание сайта на html и css Ищу работу. Предлагаю свои услуги. 8
S Хакер из Ангарска осужден на 8 месяцев за создание трояна Новости в сети 0

Название темы