• Skip to main content
  • Skip to secondary menu
  • Skip to primary sidebar
  • Skip to footer

Tech Life

エンジニアの生き方を考えるメディア

  • プログラミング
    • Python入門
    • Flask入門
    • Django入門
  • 利用規約
  • プロフィール
You are here: Home / IT・プログラミング / Python / フレームワーク / Django / Djangoの管理画面(admin)のカスタマイズ(レコード名の変更、順番の変更、検索窓の追加…)

Djangoの管理画面(admin)のカスタマイズ(レコード名の変更、順番の変更、検索窓の追加...)

2019年5月10日 by 9nmatsumoto

Djangoの中心的な機能として管理画面がある。
この記事では、その管理画面をカスタマイズして、より便利なものにしていく方法について記載する。


レコード一覧上に表示される各レコードの名前を変更する

レコード一覧画面とは以下の画面のことを言う。
ここでは、Animalというモデルを例として作成した。


上のレコード一覧画面上では、Animal object(1), Animal object(2)などと表示されており、今回はこの名前を変更する方法を説明する。

以下のようなmodelsを定義しているが、これに__str__を追加することで画面上の名前が変更される。

  • # models.py(変更前)
from django.db import models

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(変更後)
from django.db import models

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 django.contrib import admin
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 django.contrib import admin
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 django.contrib import admin
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 django.contrib import admin
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の設定
# 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の設定
TEMPLATES = [
    {
        '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の設定
<!-- 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 %}

すると画面上には下のように表示されるようになる

これを、使えば自由にDjangoの管理画面をカスタマイズできるようになります。是非、ご活用ください

Filed Under: Django Tagged With: admin, django, python

Primary Sidebar

注目記事

ITエンジニアとしてスキルを高めるためのUdemy講座一覧(格安クーポン付き)

イメージ画像

スポンサーリンク

Footer

格安学習講座

ITエンジニアとしてスキルを高めるためのUdemy講座一覧(格安クーポン付き)

20時間以上のコースが2000円以内で購入して、一つの分野をマスターできます!!