技術   Django

Django 管理画面カスタマイズ集

一覧画面

ここでは Django 管理画面の一覧画面をカスタマイズする方法を紹介します。

一覧画面に表示するカラムを指定する

一覧に表示するカラムを list_display オプションを使用して指定します。
Django のドキュメントに書いてある通りですが、下記のように一覧に表示したいカラム名を指定します。また、カラム名ではなく関数名を指定し、指定した関数名を実装すれば表示する書式等変更することも可能です。例では datetime 型の書式を変更する関数を定義しました。なお、short_description には実際に一覧画面に表示する項目名を指定します。

admin.py

from django.contrib import admin

class JobAdmin(admin.ModelAdmin):
    list_display = ('title', 'type', 'job_category', 'format_published_at')

    def format_published_at(self, obj):
        if obj.published_at is not None:
            return '{0:%Y年%m月%d日 %H時%M分}'.format(obj.published_at)
    format_published_at.short_description = '公開開始日時'

一覧画面から実行可能なアクションを追加する

アクションとは、一覧画面に設置されたセレクトボックスから実行可能な処理のことで、デフォルトでは「選択されたデータの削除」の実行が可能です。
これも Django のドキュメントに書いてある通りですが、actions オプションを使用して、追加する処理を定義した関数名を指定することで任意のアクションを追加することができます。

admin.py

from django.contrib import admin

def change_is_published(modeladmin, request, queryset):
    '''採用情報の公開フラグを変更する'''
    jobs = queryset.all()
    for job in jobs:
        if job.is_published:
            job.is_published = False
        else:
            job.is_published = True
        job.save()


change_is_published.short_description = "選択された 採用情報 の公開フラグを変更"


class JobAdmin(admin.ModelAdmin):
    actions = [change_is_published]

データ削除時に紐づいているデータも一緒に削除する

正確には一覧画面のカスタマイズではなくモデルの設定なのですが、一覧画面からデータを削除する時に、紐づいている別のモデルのデータが存在する場合、一緒に削除することが可能です。
モデルにリレーションを定義する時の on_delete オプションに models.CASCADE と設定します。こうすることで、データを削除する時にそのデータを参照している別のデータが存在する場合は、一緒に削除するけど大丈夫ですか?と Django が確認してくれるようになります。

models.py

from django.db import models

from .models import Job


class News(models.Model):
    job = models.OneToOneField(
        Job,
        on_delete=models.CASCADE,
        verbose_name='リンク先の採用情報',
        related_name='news',
        null=True,
    )
目次へ戻る

登録画面

ここでは Django 管理画面のデータ登録画面のカスタマイズ方法を紹介します。

登録フォームに表示される Inputbox や Textarea などのサイズを変更する

登録フォームに表示される Inputbox や Texarea などのサイズを揃えて入力しやすく見栄えを良くできます。Django のドキュメントにも書いてますが、formfield_overrides オプションを使用します。具体的には下記のように指定します。数値の値を変更して丁度良いサイズにしてください。

admin.py

from django.contrib import admin
from django.forms import Textarea, TextInput


class JobAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.CharField: {'widget': TextInput(attrs={'size': '81'})},
        models.TextField: {
            'widget': Textarea(attrs={'cols': '80', 'rows': '3'}),
        }
    }

登録フォームの入力項目を種類毎に区切ったり表示順番を変更する

登録フォームの入力項目を種類毎に区切ったり、表示する順番を変更するには fieldsets オプションを使用します。例によって Django のドキュメントにも書いてますが、fieldsets オプションを使用します。具体的には下記のように指定します。

admin.py

from django.contrib import admin


class JobAdmin(admin.ModelAdmin):
    fieldsets = (
        ('項目1', {'fields': ('カラム名1', 'カラム名2')}),
        ('項目2', {'fields': ('カラム名3', 'カラム名4')}),
        ('項目3', {'fields': ('カラム名5', 'カラム名6')})
    )
目次へ戻る

終わりに

Django のデフォルトの管理画面は、少し追加するだけでさらに使いやすくすることができます。実装するサイト要件によって必要なカスタマイズを追加していくと良いと思います。もちろん他にも色々とカスタマイズする方法があるので記事を随時更新していきます。

目次へ戻る