1
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管理画面のカスタマイズまとめ

Posted at

#はじめに
Djangoの管理画面は手軽に使える点が魅力的だがカスタマイズ関連での困りごとが多い
カスタマイズして調べたことを忘れないうちにまとめておく

#モデルごとの管理画面のカスタマイズ
##基本的な使い方
モデルごとの画面や機能をカスタマイズしたいときは独自のModelAdmin派生クラスを用意して
AdminSiteのregister()の第二引数として渡す

アプリ名/admin.py
from django.contrib import admin
from .models import Book
#Bookの場所には適宜クラス名を入れる

class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title','size')
#クラス変数やメソッドをオーバーライドする

admin.site.register(Book, BookAdmin)

ModelAdmin派生クラス内での記述により、表示する項目を変えたり
フィルターをつけたり検索機能をつけたりできる
出来ることについては以下参照
Django 管理画面逆引きメモ
##管理画面でのアクセス制御
スーパーユーザーのみの閲覧にしたいモデルがあるときは

admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title','size')
    
    def has_view_permission(self,request,obj=None):
        return request.user.is_superuser

また、閲覧は出来るが追加や変更、削除の権限をOFFにも出来る
引用元:DjangoでRead OnlyなModelAdmin

admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title','size')
    
    def __init__(self, *args, **kwargs):
        super(ReadOnlyAdmin, self).__init__(*args, **kwargs)
        # すべてのフィールドをreadonlyに設定
        self.readonly_fields = [field.name for field in self.model._meta.get_fields()]

    def has_add_permission(self, request):
        # 追加の権限OFF
        return False

    def has_change_permission(self, request, obj=None):
        # 変更の権限OFF
        return False

    def has_delete_permission(self, request, obj=None):
        # 削除の権限OFF
        return False

#adminテンプレートの上書き(オーバーライド)
管理画面はテンプレートが上書きできるため見た目を変えることができる
自分好みの管理画面もオーバーライドによって実装できる

管理画面の元テンプレートはcontrib/admin/template/adminに格納されている
上書きする場合は
①settings.pyのTEMPLATE_DIRで設定されているディレクトリにadmin/を追加する
②上書きしたい管理対象を、上記ディレクトリ配下に アプリ名/モデル名/ で追加する
③テンプレートを追加する
詳しい上書き対象については下記リンクを参照
Django adminテンプレートのオーバーライド方法について解説

基本的には必要な部分だけ上書きする方が効率的
例:hogeアプリのfugaモデルの一覧画面を上書きしたいときはtemplatesフォルダに
  admin/hoge/fuga/change_list.htmlを作成。
あとは以下のように変更したい{% block %}を上書きしていく

change_list.html
{% extend 'admin/change_list.html' %}
{% block 'content' %}

<!-- 追加したいフォームや変数など --!>

{{ block.super }}
{% endblock %}

#管理画面でのクエリの大量発行(n+1問題)
adminでのクエリの大量発行が起きている場合、これで解決できた

admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title','size')

    def get_queryset(self,request):
        return super().get_queryset(request),select_related(メソッド名)

#最後に
一人て開発していると割と適当になりがちな管理画面だが、規模が大きい開発では管理画面が使いやすい方がいいんだなと痛感しました
管理画面を使わずに個別でページを自作している人は割と簡単に作れるので試して欲しいです
###参考文献
この方が出している本はわかりやすいのでおすすめです(小学生並の感想)
現場で使える Django 管理サイトのつくり方
boothでも売っているので検索してみてください

1
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
1
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?