How to Create Django Admin List Actions - Apply 10% discount and Export to csv
All Django Admin list views already a default action Delete selected.
In this short tutorial I will show how create your own list actions.
Database Table
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title VARCHAR (50),
publication_date DATE,
author VARCHAR (30),
price DECIMAL,
pages INTEGER (11),
book_type INTEGER
);
models.py
#models.py from django.db import models class Book(models.Model): FANTASY = 1 MYSTERY = 2 ROMANCE = 3 BOOK_TYPES = ( (FANTASY, 'Fantasy'), (MYSTERY, 'Mystery'), (ROMANCE, 'Romance'), ) title = models.CharField(max_length=50) publication_date = models.DateField(null=True) author = models.CharField(max_length=30, blank=True) price = models.DecimalField(max_digits=5, decimal_places=2) pages = models.IntegerField(blank=True, null=True) book_type = models.PositiveSmallIntegerField(choices=BOOK_TYPES) class Meta: db_table = 'books'admin.py
#admin.py from django.contrib import admin import decimal, csv from django.http import HttpResponse from django.db.models import F from myapp.models import Book def export_books(modeladmin, request, queryset): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="books.csv"' writer = csv.writer(response) writer.writerow(['Title', 'Publication Date', 'Author', 'Price', 'Pages', 'Book Type']) books = queryset.values_list('title', 'publication_date', 'author', 'price', 'pages', 'book_type') for book in books: writer.writerow(book) return response export_books.short_description = 'Export to csv' class BookAdmin(admin.ModelAdmin): list_display = ['title', 'publication_date', 'author', 'price', 'book_type'] actions = ['apply_discount', export_books] def apply_discount(self, request, queryset): queryset.update(price=F('price') * decimal.Decimal('0.9')) apply_discount.short_description = 'Apply 10%% discount' admin.site.register(Book, BookAdmin)