Добавление настраиваемых действий на сайт администрирования

Джанго предлагает широкий выбор параметров для настройки сайта администрирования. Мы собираемся изменить представление списка объектов, включив в него пользовательское действие администратора.

Действие администратора работает следующим образом: пользователь выбирает объекты на странице списка объектов с чекбоксами, затем выбирает действие для выполнения всех выбранных элементов и выполняет его. На следующем снимке экрана показаны действия, расположенные на сайте администрирования:

Создавайте настраиваемые действия администратора, чтобы позволить сотрудникам применять действия к нескольким элементам одновременно.

Можно создать настраиваемое действие, записывая обычную функцию, которая получает следующие параметры:

  • Текущий ModelAdmin
  • Текущий объект запроса как экземпляр HttpRequest
  • QuerySet для объектов, выбранных пользователем

Эта функция будет выполняться, при выполнении действия с сайта администрирования.

Мы собираемся создать настраиваемое действие администратора для загрузки списка заказов в виде CSV-файла. Измените файл admin.py приложения orders и добавьте следующий код перед классом OrderAdmin:

import csv
import datetime
from django.http import HttpResponse


def export_to_csv(modeladmin, request, queryset):
    opts = modeladmin.model._meta
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename={}.csv'.format(opts.verbose_name)
    writer = csv.writer(response)
    fields = [field for field in opts.get_fields() if not field.many_to_many and not field.one_to_many]
    # Write a first row with header information
    writer.writerow([field.verbose_name for field in fields])
    # Write data rows
    for obj in queryset:
        data_row = []
        for field in fields:
            value = getattr(obj, field.name)
            if isinstance(value, datetime.datetime):
                value = value.strftime('%d/%m/%Y')
            data_row.append(value)
        writer.writerow(data_row)
    return response
export_to_csv.short_description = 'Export to CSV'

В этом коде выполняются следующие задачи:

  • Мы создаем экземпляр HttpResponse, включающий кастомный text/csv-тип контента, чтобы сообщить браузеру, что ответ должен обрабатываться как файл CSV. Также добавляется заголовок Content-Disposition, указывающий, что HTTP-ответ содержит вложенный файл.
  • Мы создаем объект CSV writer, который будет записывать в объект response.
  • Поля model получаются динамически с помощью метода get_fields() параметров модели _meta. Мы исключаем связи "многие ко многим" и "один ко многим".
  • Мы пишем строку заголовка, включая имена полей.
  • Мы переходим по заданному запросу и зиписываем строку для каждого объекта, возвращаемого запросом. Мы осторожно форматируем объекты datetime, поскольку выходное значение для CSV должно быть строкой.
  • Мы настраиваем отображаемое имя для действия в шаблоне, установив атрибут short_description для нашей функции.

Мы создали универсальное действие, которое можно добавить к любому классу ModelAdmin.

Наконец, добавьте новое действие export_to_csv admin к классу OrderAdmin следующим образом:

class OrderAdmin(admin.ModelAdmin):
    # ...
    actions = [export_to_csv]

Откройте в браузере http://127.0.0.1:8000/admin/orders/order/ . Результирующее действие администратора должно выглядеть следующим образом:

Отметьте некоторые заказы и выберите действие Export to CSV из поля select, затем нажмите кнопку Go. В браузере будет загружен созданный CSV-файл с именем order.csv. Откройте загруженный файл с помощью текстового редактора. Содержимое может быть приведено в следующем формате, включая строку заголовка и строку для каждого выбранного объекта Order:

ID,first name,last name,email,address,postal
code,city,created,updated,paid
3,Antonio,Melé,[email protected],Bank Street 33,WS J11,London,25/
05/2015,25/05/2015,False
...

Как вы можете видеть, создание действий администратора довольно просто.

results matching ""

    No results matching ""