Djangoの中心的な機能として管理画面がある。
この記事では、その管理画面をカスタマイズして、より便利なものにしていく方法について記載する。
レコード一覧上に表示される各レコードの名前を変更する
レコード一覧画面とは以下の画面のことを言う。
ここでは、Animalというモデルを例として作成した。
上のレコード一覧画面上では、Animal object(1), Animal object(2)などと表示されており、今回はこの名前を変更する方法を説明する。
以下のようなmodelsを定義しているが、これに__str__を追加することで画面上の名前が変更される。
- # models.py(変更前)
class Animal(models.Model):
name = models.CharField(max_length=256)
height = models.PositiveIntegerField()
weight = models.PositiveIntegerField()
class Human(models.Model):
first_name = models.CharField(max_length=256)
last_name = models.CharField(max_length=256)
phone = models.PositiveIntegerField()
これに、__str__メソッドを追加する
- # models.py(変更後)
class Animal(models.Model):
name = models.CharField(max_length=256)
height = models.PositiveIntegerField()
weight = models.PositiveIntegerField()
def __str__(self):
return self.name
class Human(models.Model):
first_name = models.CharField(max_length=256)
last_name = models.CharField(max_length=256)
phone = models.PositiveIntegerField()
def __str__(self):
return f"{self.first_name} {self.last_name}"
画面上には、以下のように表示される。
- Animalモデル
名前(self.name)が画面上に表示される。
- Humanモデル
名前 苗字(self.firstname + self.last_name)が画面上に表示される。
各レコード画面上の項目と順番を変更する
次に、レコード画面上の項目(カラム)の表示項目と順番を変える方法について紹介する。
これは、admin.pyで以下のように各モデルにModelAdminを継承したクラスを設定すればよい。
- # admin.pyの設定
from . import models
# django.contrib.admin.ModelAdminを継承したクラスを作成
class HumanAdmin(admin.ModelAdmin):
# fields変数を設定する
fields = ['phone', 'last_name']
# admin.site.registerの第2引数に設定する
admin.site.register(models.Human, HumanAdmin)
admin.site.register(models.Animal)
上のように設定すると管理画面のHumanモデルの各レコードでphone, last_nameカラムが表示され、順番もその通りになる。
- レコード画面(変更前)
First nameとLast nameとPhoneが表示される
- レコード画面(変更後)
HumanAdminで設定したfields(phone, last_name)だけが表示される
レコード一覧上の検索窓の検索対象を変更する
これには、admin.pyにsearch_fieldsを設定したdjango.contrib.admin.ModelAdmin継承のクラスを作成して、モデルに設定する。
- # admin.pyの設定
from . import models
class HumanAdmin(admin.ModelAdmin):
# 検索窓で検索すると、last_name, first_nameから中間一致検索が行われる
search_fields = ['last_name', 'first_name']
admin.site.register(models.Human, HumanAdmin)
admin.site.register(models.Animal)
上のようにsearch_fields上に検索対象を指定すると、指定したカラムで検索できるようになる
検索窓が表示される。
レコード一覧上にフィルターを追加する
レコード一覧画面上にフィルターがあると、同じ要素のレコードで絞りこみができるようになる。
admin.pyにlist_fileterを追加すればよい。
- # admin.pyの設定
from . import models
class HumanAdmin(admin.ModelAdmin):
list_filter = ['first_name', 'last_name']
admin.site.register(models.Human, HumanAdmin)
admin.site.register(models.Animal)
実際画面上には、以下のように表示される。
右端のFILTERで絞り込むことができ、画面上では、First NameがTaroのもののみで絞り込んでいる。
レコード一覧上に表示する項目を変更する
レコード一覧上に表示する項目を変更するには、admin.py上にlist_displayを設定すればよい。
- # admin.pyの設定
from . import models
class HumanAdmin(admin.ModelAdmin):
list_display = ['first_name', 'last_name']
admin.site.register(models.Human, HumanAdmin)
admin.site.register(models.Animal)
上のように設定すると、レコード一覧画面上にfirst_name, last_nameが表示されるようになる。
レコード一覧画面上から値を変更できるようにする
レコード一覧画面上から値を変更するには、admin.pyにlist_editableを設定すればよい。
例えば、以下の設定をするとfirst_nameカラムをレコード一覧画面上から編集できるようになる。
また、list_editableに設定するカラムは、list_displayに設定しなければならない。
また、list_displayの1番目のカラムは詳細画面のリンクになるため、list_editableに設定にはできない(ただし、list_display_linksに2番目以降のカラムを設定すればよい)
- # admin.pyの設定
from django.contrib import admin
from . import models
class HumanAdmin(admin.ModelAdmin):
list_display = ['first_name', 'last_name']
list_editable = ['last_name']
# list_editable = ['first_name']とする場合
# list_display_links = ['last_name']
admin.site.register(models.Human, HumanAdmin)
admin.site.register(models.Animal)
実際に表示される画像
last_nameが編集できるようになる
画面のレイアウトを変える
画面のレイアウトを変えるには、adminのテンプレートファイルをプロジェクト上に作成して元のファイルを上書くことでできる。
以下のようにする。
まず、settings.pyのTEMPLATES変数を編集する。
- # settings.pyの設定
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],# templatesのディレクトリを設定する
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
次に、プロジェクト直下に/templates/adminフォルダを作成する。
このadminフォルダ内に、管理サイトで利用するテンプレートファイルを作成してそこに自分ようにカスタマイズする。
それには、まずdjangoのGithub上のソースコードから元のファイルを取得する。
(URL)
上記URLの下の、contrib/admin/templates/adminフォルダ
内のファイルを開いて中身をコピーする。
次に、templates/admin内に同名のファイルを作成して中身を張り付け、内容を変更する。
ここでは、base_site.htmlを編集する。
- # base_site.htmlの設定
{% extends "admin/base.html" %}
{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">フリーランスのDjango画面</a></h1>
<!-- 名前を編集 -->
{% endblock %}
{% block nav-global %}{% endblock %}
すると画面上には下のように表示されるようになる