djangoでadmincssをオーバーライドする


回答:


110

それはあなたがやりたいことの多くに依存します。まず第一に:Django管理者で直接上書きしないでください。あなたは私が合理的だと思う2つのオプションを手に入れました:

  1. 一般に管理者の外観を変更する場合は、管理者テンプレートをオーバーライドする必要があります。これについては、ここで詳しく説明しています:管理者テンプレートのオーバーライド。場合によっては、元の管理ファイルを拡張{% block extrastyle %}{% endblock %}django/contrib/admin/templates/admin/base.htmlてから、例のようにブロックを上書きすることができます。
  2. スタイルがモデル固有の場合は、のMediaメタクラスを介してスタイルを追加できますadmin.py。ここで例を参照してください:
class MyModelAdmin(admin.ModelAdmin):
    class Media:
        js = ('js/admin/my_own_admin.js',)    
        css = {
             'all': ('css/admin/my_own_admin.css',)
        }

実際には、モデルレベルではなく、サイト全体です。base.css、ie.cssなどの特定の変更。1つのオプションは、アプリケーション自体にadmin / base.htmlを含め、admin /base.htmlファイルでカスタムbase.cssを使用することです。そうすれば、django管理者から自分のサイトにいくつかのテンプレートファイルを含める必要があります。これよりも良い解決策はありますか?
rajan sthapit 2011

私が知っているものはありません。django管理者は、最終的にはdjangoの再利用可能なアプリに他なりません。これは、他の再利用可能なアプリと同じように使用する方法です。
Torsten Engelbrecht 2011

ここのjs内に.cssファイルがリストされていることに気づきました...それは実際に機能しますか?私はそれを得ることができません。
fastmultiplication 2012

はい、その通りです。私は間違いを犯し、djangoドキュメントの例を使って答えを編集しました。
Torsten Engelbrecht 2012

エリ・ポーターの言葉によれば、「あなたは最高の猫を焼きました」。
RobKwasowski19年

32
  • settings.pyアプリがで管理する前にリストされていることを確認しますINSTALLED_APPS
  • 作成(your-app)/templates/admin/base_site.htmlおよびput<style>にブロックを{% block extrahead %}

例:

{% extends "admin/base_site.html" %}
{% block extrahead %}
    <style>
        .field-__str__ {
            font-family: Consolas, monospace;
        }
    </style>
{% endblock %}

6
ベストアンサー。必要に応じて、ベースプロジェクトに「テンプレート」ディレクトリを配置し、settings.py:TEMPLATES = [... other stuffs ...、 'DIRS':[ os.path.join(BASE_DIR、 'templates')]、]
RedPelle 2018年

いい案!チャームのようにスムーズに動作します!
ozw1z 54

29

admin / base.htmlを拡張して、自分のcssファイルへの参照を含めました-最後に。cssの利点は、既存の定義に触れる必要がなく、再定義するだけでよいことです。


27

このソリューションは管理サイトbase_site.htmlで機能します。djangoのアップグレード時に変更されないものをオーバーライドするため、最もクリーンな方法だと思います。

テンプレートディレクトリにadminという名前のフォルダを作成し、という名前のファイルを作成しますbase_site.html

静的ディレクトリの。cssというファイルの下に作成しますadmin-extra.css

フォームに必要なすべてのカスタムCSSを次のように記述しますbody{background: #000;}

これをbase_site.html:に貼り付けます

{% extends "admin/base.html" %}
{% load static from staticfiles %} # This might be just {% load static %} in your ENV

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "css/admin-extra.css" %}" />{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}

{% block nav-global %}{% endblock %}

コメントで述べたように:INSTALLED_APPSでアプリが管理アプリの前にあることを確認してください。そうでない場合、テンプレートはdjangoを上書きしません

それでおしまい!完了です


4
ありがとう、うまくいきます!それが機能しない場合は、アプリがの管理アプリの前にあることを確認してくださいINSTALLED_APPS。そうでない場合、テンプレートはdjangoを上書きしません。
dirbaio 2016年

1
ベストアンサーとコメント。管理ページの色を変更するのは驚くほど難しいです。この回答とコメントに目を通すことで、その仕組みが固まりました。
ダニエルバトラー

1
base_site.htmldjangoをアップグレードするときにそれが決して変わらないことをどうやって知っていますか?(つまり、この回答は3歳であり、まだ機能しますが、それは保証人ではありません)
Marv

@marvソースコードの内部を見ると、管理アーキテクチャがこれらの特定の名前、特にURLとテンプレートレンダリングを中心に構築されていることが非常に簡単にわかります。クラスを継承するクラスを継承するクラスは、Djangoフレームワークの大幅な再設計がない限り(そしてそれでも私はこの変更に賭けない)、これらの名前が同じままであることに依存します。 djangoのロードマップによれば、基本テンプレートをオーバーライドするだけでなく、少なくとも今後3年間は同じままです。
エラッドシルバー

1
それで、これはdjangoに関する一般的な知識であり、これを確認する具体的な情報源はありませんか?私はあなたを疑っているわけではありません、私はこれが事実であることをどうやって知ることになっているのだろうかと思います。
Marv

16

静的ディレクトリにstatic/admin/css/base.cssファイルを作成します。

最初にDjangoのデフォルトの管理CSSを貼り付けてから、下部にカスタマイズを追加します。


8
これを行う場合は、必ずアプリdjango.contrib.adminをのリストに追加してくださいINSTALLED_APPS。そうしないと、collectstaticは最初にadmin base.cssを見つけ、カスタマイズされたバージョンはそれを上書きしません。
デイブ

3
これは良い長期的な解決策ではありません。大量のコードをコピーして貼り付け、Djangoのアップグレード時に維持されません。
mlissner 2017

Django管理者へのスタイリングは、基本的にコードのフォークです。Djangoをアップデートすると、実際にはカスタマイズが壊れる可能性があります。カスタマイズを最小限に抑え、Djangoのデフォルトのスタイルの下部に追加することをお勧めします。次に、必要に応じて、デフォルトのスタイルを手動で更新できます。
ライアンアレン

上記の@ danny-w-adairの答えの方が優れています。物事を「DRY」に保ちますが、それでもDjangoのコードのフォークであり、マイナーなアップグレードの問題につながる可能性があります。
ライアンアレン

10

グローバルスコープが必要で、テンプレートのオーバーライドについて考えたくない場合は、ミックスインがこれに非常に適しています。このコードを好きな場所に置いてください:

class CSSAdminMixin(object):
    class Media:
        css = {
            'all': ('css/admin.css',),
        }

次に、admin.cssオーバーライドを使用して呼び出されるCSSファイルを作成します。次に例を示します。

select[multiple] {
    resize: vertical;
}

次に、必要なモデルで次の手順を実行します。

class MyModelAdmin(admin.ModelAdmin, CSSAdminMixin):

そして、あなたはすべて設定されます。


私はあなたの答えが好きですが、MyModelAdminに直接追加しないのはなぜですか
Goran

1
1つのモデルであればそれは可能ですが、多くのモデルでそれを行うと面倒になります。
mlissner 2017年

4

admin/css/changelists.cssフォルダ内STATICFILES_DIRSにあり、デフォルトの管理者の代わりにそのchangelists.cssを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.