DjangoAdminでオリジナルのcssやjsを設定する為の共通クラスを作ってみる

Django

DjangoAdminで自分用のcssやjsを使用する際はテンプレートを上書きするべきか?

DjangoAdminを使用することはとても便利なのですが、cssやjsをカスタマイズしたいと思うことが出てきたりします。

そこで取れる方法としては、テンプレートを上書きするか、ModelAdminのサブクラス内でmediaを書き換えることかなと思います。

個人的には、めちゃくちゃ色々と弄る以外では、テンプレートを書き換えることはすべきではないと思っているので、ここではModelAdminのサブクラスとして、色々なAdminページで使用するベースクラスを作りました。

media propertyを上書きする

上記の通り、ModelAdminのサブクラスでmediaを上書きするようにしました。

from django.contrib.admin import ModelAdmin

class BaseModelAdmin(ModelAdmin):
    css = None
    js = None

    @property
    def media(self):
        media = super(BaseModelAdmin, self).media
        if self.css:
            media._css_lists.append({
                'all': self.css
            })
        if self.js:
            media._js_lists.append(self.js)
        return media

そして、使い方としては、Adminページを作る際に、このクラスを継承するようにします。
cssやjsはリストに複数設定可能です。

from django.templatetags.static import static

class BookAdmin(BaseModelAdmin):
    css = [static('admin/css/book.css')]
    js = [static('admin/js/book.js')]

こんな感じで、テンプレート側を汚さずにcssやjsを追加出来るようになりました。

最後に

DjangoAdminは有用なものの、ページ数が増えてきたりするとpaginatorが重くなってきたりと、色々問題が起きてくることもあり、カスタマイズのしがいがあって面白いです。

コメントを残す