はじめに
こんにちは、アプリチームの遠藤です。今回は「Django Admin 管理画面を作成してみた」に引き続き、PythonのWebフレームワークであるDjangoに組み込まれているDjango Adminのカスタマイズを行っていきます。この記事は前回の記事の内容である管理サイトの作成からモデルを登録するまでの知識がある前提で書いているのでご了承ください。
使用するアプリケーションとモデル
カスタマイズ可能な項目を紹介するために使用するアプリケーションとモデルを紹介します。前回の記事で使用したアプリケーション「myapp」と新たに作成したモデル「CustomModel」を使用して紹介していきます。
model.py
#myapp/model.py
from django.db import models
from django.utils import timezone
class CustomModel(models.Model):
name = models.CharField('名前', max_length=30)
age = models.IntegerField(verbose_name='年齢')
date = models.DateField('日付', default=timezone.now)
text = models.CharField('テキスト', max_length=30, default='text')
int = models.IntegerField('整数' , default=1)
admin.py
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
admin.site.register(CustomModel)
管理サイトの日本語化
前回の記事ではアプリケーション全体が英語の状態で管理画面を作成しましたが、今回は日本語化する方法をご紹介します。Django Adminはデフォルトで多言語対応(国際化・地域化)の機能を持っているため、特に難しくなく日本語化することが可能となっています。
使用言語の変更
config/settings.pyのLANGUAGE_CODEを編集し、’en-us’から’ja’に変更することでサイトの多くの部分を日本語させることができます。
# config/settings.py
...
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
...
しかし、アプリケーション名のモデル名やモデル名に関しては日本語化されていません。
アプリケーションの日本語化
アプリケーションを日本語化するには日本語化したいアプリケーションのapps.pyを編集する必要があります。verbose_nameを変更することで変更することができます。
from django.apps import AppConfig
class MyappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'myapp'
verbose_name = 'アプリケーション'
モデル名の日本語化
次はモデル名の日本語化を行います。model.pyのMetaクラスにverbose_nameを設定することで日本語化する事ができます。しかし、verbose_nameの設定のみだと、複数形の表す「s」が付き表示が乱れます。verbose_name_pluralにも同じ値をセットすることで、表示の乱れをなくすことができます。
#myapp/model.py
from django.db import models
from django.utils import timezone
class CustomModel(models.Model):
name = models.CharField('名前', max_length=30)
age = models.IntegerField(verbose_name='年齢')
date = models.DateField('日付', default=timezone.now)
text = models.CharField('テキスト', max_length=30, default='text')
int = models.IntegerField('整数' , default=1)
class Meta:
verbose_name = 'カスタムモデル'
verbose_name_plural = 'カスタムモデル'
一覧ページのカスタマイズ
ここでは一覧ページでカスタマイズできる項目について整理します。表示を確認するために予めオブジェクトを10件作成しております。
デフォルトの状態だと、一覧ページでCustomModel object(1)のような表記になっています。
一覧ページで表示するフィールドを指定する
admin.pyでlist_displayを設定することで、一覧ページで表示するフィールドの指定を行うことができます。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
# 表示するフィールドの指定
list_display = ['id', 'name']
admin.site.register(CustomModel)
フィルター機能
指定したフィールドを元に絞り込みを行えるフィルター機能を追加します。list_filterで絞り込みを行う対象を指定することで実装することができます。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
list_display = ['id', 'name']
list_filter = ['age']
admin.site.register(CustomModeladmin.site.register(CustomModel)
一覧ページの右側にフィルター機能が表示され、年齢で絞り込みが行えるようになります
検索機能
search_fieldsを設定することで、設定したフィールドに対して検索を行うことができる検索ボックスを追加することができます。
from django.db import models
from django.utils import timezone
class CustomModel(models.Model):
name = models.CharField('名前', max_length=30)
age = models.IntegerField(verbose_name='年齢')
date = models.DateField('日付', default=timezone.now)
text = models.CharField('テキスト', max_length=30, default='text')
int = models.IntegerField('整数' , default=1)
一覧ページの上部に検索ボックスが追加され、入力された文言を含むオブジェクトを検索できるようになります。
デフォルトの並び順の設定
ordering = [‘id’] のようにフィールドを指定することで、デフォルトの状態で表示される並び順を指定したフィールドの昇順で表示することができます。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
list_display = ['id', 'name',]
list_filter = ['age']
search_fields = ['name']
ordering = ['id']
admin.site.register(CustomModel)
また「-」をつけることで降順にすることもできます。
ordering = ['-id']
一覧ページで表示するオブジェクト数の指定する
list_per_pageを利用することで一覧ページで表示するオブジェクト数の指定を行うことができます。デフォルトの値は100です。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
list_display = ['id', 'name',]
list_filter = ['age']
search_fields = ['name']
ordering = ['id']
list_per_page = 5
admin.site.register(CustomModel)
上のコードに変更することで、オブジェクトが5件ずつ表示されるようになりました。
一覧ページ内で編集を行う
list_editableを使用することで、一覧ページ内でオブジェクトの編集を行うことができます。ただし、list_editableで指定するフィールドはlist_displayに含まれている必要がある点にご注意ください。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
list_display = ['id', 'name',]
list_filter = ['age']
search_fields = ['name']
ordering = ['id']
list_per_page = 5
list_editable = ['name']
admin.site.register(CustomModel)
上のように変更することで、名前に関して一覧ページで編集ができるようになります。
追加/変更ページのカスタマイズ
ここでは追加/変更ページでカスタマイズできる項目について整理します。
デフォルトの状態だと、以下のような状態になっています。
表示する項目を設定する
特に編集していない状態だと、追加/変更ページではモデルで定義を行ったテーブルがすべて表示されます。fieldsを指定することで表示させる項目を設定することができます。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
fields = ['name', 'age']
admin.site.register(CustomModel)
読み取り専用のフィールドを設定する
readonly_fieldsを使用することで、値の書き換えが行えない読み取り専用のフィールドを作成することができます。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
readonly_fields = ['date', 'text']
admin.site.register(CustomModel)
表示しないフィールドを設定する
excludeを使用することで、fieldsとは逆に表示しないフィールドを設定する事ができます。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
exclude = ['age', 'int']
admin.site.register(CustomModel)
フィールドを分類分けする
fieldsetsを利用することで、分類分けをすることができます。
# myapp/admin.py
from django.contrib import admin
from .models import CustomModel
class CostomModelAdmin(admin.ModelAdmin):
fieldsets = [
('分類1', {'fields': ['name', 'age']}),
('分類2', {'fields': ['date', 'text']}),
]
admin.site.register(CustomModel)
ホームページのタイトルなどのカスタマイズ
config/urls.pyを編集することで、ホームページタイトルや上部メニューに表示されるヘッダーなどを変更することができます。
from django.contrib import admin
from .models import CustomModel
admin.site.site_title = 'サイトタイトル'
admin.site.site_header = 'ヘッダー'
admin.site.index_title = '目次タイトル'
urlpatterns = [
path('admin/', admin.site.urls),
]
管理サイトのURLのカスタマイズ
config/urls.pyのurlpatternsを編集することで、管理サイトのURLを変更することができます。
from django.contrib import admin
from .models import CustomModel
admin.site.site_title = 'サイトタイトル'
admin.site.site_header = 'ヘッダー'
admin.site.index_title = '目次タイトル'
urlpatterns = [
path('costom_url/', admin.site.urls),
]
終わりに
今回はDjango Adminで実現できるカスタマイズについて紹介しました。デフォルトで日本語化やUI周りの調整が行えるのはありがたいですね。こちらの記事でもDjango Adminについて紹介しているので合わせて読んでいただくと理解が深まると思います。