article

Monday, June 8, 2020

How to Create Django Admin List Actions - Apply 10% discount and Export to csv


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)

Related Post