0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Django】adminページをカスタマイズしたいって?

Posted at

はじめに

「Djangoの管理者ページのカスタマイズなんて、今までしたことないよ〜」という方向け。
初級編です。

カスタマイズしなくても十分使えそうだが、エンジニア以外の人が触るようになると、デフォルトだと少し寂しい?

詳細な解説というより、ググると良い用語をパパッと上げていくスタイルです。
ちゃんとまとめると大変ですからね。。。

Djangoのドキュメント
https://docs.djangoproject.com/en/3.0/ref/contrib/admin/

ModelAdminクラス

基本的には、ModelAdminクラスのサブクラスを作成して、カスタマイズ内容を記述する。
例えばSampleModelという名前のモデルをカスタマイズしようと思ったら、以下のようにする。

admin.py

from django.contrib import admin

# 通常は「モデル名+Admin」という名前にする
class SampleModelAdmin(admin.ModelAdmin):
    '''
    このクラスの中にカスタマイズ内容を記述
    '''

# SampleModelにSampleModelAdminを適用
admin.site.register(SampleModel, SampleModelAdmin)

これ以降は、ModelAdminクラスの中の記述のみを書く。
例えば


def hoge():
    return

と書いたら、実際は

admin.py
class SampleModelAdmin(admin.ModelAdmin):
    def hoge():
        return

と読み替えてください。

どんなカラムを表示するか

スクリーンショット 2020-08-08 20.38.22.png

レコード一覧の一番上にカラム名が表示されるが、どんなカラムを表示したいか設定しよう。
以下はモデルがtext,updated_atというフィールドを持っていた場合の例。

list_display = ('__str__', 'text', 'updated_at')  # この3つのカラムを表示する

次に、フィールドにはない値を表示する場合。

list_display = ('__str__', 'text', 'updated_at', 'get_owner_name')

def get_owner_name(self, obj):
    # 第二引数のobjはレコード自身を表す
    return "I am owner"
get_owner_name.short_description = 'オーナー名'

こうすると「オーナー名」というカラムが追加され、この場合は全てのレコードに「I am owner」と表示される。

検索対象を設定する

スクリーンショット 2020-08-08 21.08.22のコピー.png

上部に検索ボックスが存在するが、その検索対象を絞ることができる。

# SampleModel.text, SampleModel.updated_at, SampleModel.owner.username を検索対象にする
search_fields = ('text', 'updated_at', 'owner__username`)

操作を追加する

スクリーンショット 2020-08-08 21.32.13のコピー.png

デフォルトでは「選択された<モデル名>の削除」という操作が存在するはず。
自作のアクションは以下のようにactionsにリスト形式で記述するが、ここに明示的に含めなくても「選択された<モデル名>の削除」は存在し続ける。

actions = ['my_custom_action']

def my_custom_action(self, request, queryset):
    # なんか処理
    return None
my_custom_action.short_description = '私だけのアクション'

return Noneとすれば操作完了時に何もしないが、例えばテンプレートを返してページ遷移なんかもできる。

モデルの表示名を変更する

スクリーンショット 2020-08-08 21.32.13.png

これはModelAdminではなく元のModelクラスに書いておく。


class SampleModel(models.Model):
     class Meta:
         verbose_name = 'サンプルモデル'
         verbose_name_plural = 'サンプルモデル一覧'

フィールドにリンクを貼るか


list_display_links = ('text',)

応用編:検索処理のカスタマイズ

検索対象のカスタマイズを紹介しましたが、検索ワード(クエリ)が与えられた時に、実際にどのような検索を行うかもカスタマイズできます。
これは長くなるので概要だけにしますが、以下の関数を定義して検索処理を上書きします。


def get_changelist(self, request, **kwargs):

最後に

以上のカスタマイズができれば、はじめはそこそこ満足ではないでしょうか?
adminページのテンプレート自体のカスタマイズや、admi内でのページ遷移については別の記事で書こうかと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?