Добавление настраиваемых действий на сайт администрирования
Джанго предлагает широкий выбор параметров для настройки сайта администрирования. Мы собираемся изменить представление списка объектов, включив в него пользовательское действие администратора.
Действие администратора работает следующим образом: пользователь выбирает объекты на странице списка объектов с чекбоксами, затем выбирает действие для выполнения всех выбранных элементов и выполняет его. На следующем снимке экрана показаны действия, расположенные на сайте администрирования:
Создавайте настраиваемые действия администратора, чтобы позволить сотрудникам применять действия к нескольким элементам одновременно.
Можно создать настраиваемое действие, записывая обычную функцию, которая получает следующие параметры:
- Текущий 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
...
Как вы можете видеть, создание действий администратора довольно просто.