DjangoAdminに独自ページを追加する

DjangoAdminに独自のページを定義して、管理画面にリンクを貼るまでのメモ。
独自ページが作れるようになるとだいぶDjangoAdminの自由度が広がります。

環境

  • Python3
  • Django 1.9

実装手順

  1. 独自ページを作成する
    1. URLの登録
    2. Viewの作成
    3. Templateの作成
  2. 既存のAdminページにリンクを貼る

独自のページを作成する

https://docs.djangoproject.com/ja/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls

ここにある手順でDjangoに独自ページを拡張できます。

URLの登録

まずDjangoAdminを定義してるクラスに独自ページのURL定義をします。

# coding: utf-8

from django.contrib import admin


@admin.register(Hoge)
class HogeAdmin(admin.ModelAdmin):

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            url(r'^my_view/$', self.admin_site.admin_view(self.my_view)),
        ]
        return my_urls + urls

get_urlsという関数をオーバーライドすることで、独自のURLを追加することが出来ます。
ここで追加したURLはurls.pyをどう定義しているかにもよりますが、基本は
/admin/app/hoge/my_viewみたいな形でアクセス可能です。HogeモデルのAdminに追加しているので、hogeのリストページの階層に追加される形です。
(例は良くないですが、appはAPP名、hogeはModel名としています)

my_viewという後で追加するView関数はadmin_viewというdjangoの関数でデコレートしています。これを付けることでAdminのログインやキャッシュ無効などをよしなに行ってくれます。

Viewの作成

次にmy_viewというViewを実装します。

    def get_urls(self):
        ……
        return my_urls + urls

    def my_view(self, request):
        context = dict(
           self.admin_site.each_context(request),
        )
        return TemplateResponse(request, "admin/app/hoge/my_view.html", context)

先ほどのget_urlsの直下にこのような形でmy_viewを作成します。通常のDjangoのViewと変わらずに扱えると思います。

Templateの作成

Viewが呼び出しているTemplateを定義します。Templatesフォルダ直下に
`admin/app/hoge/'という階層を作成し、そこにmy_view.htmlを置きます。パスがあっていればどこに置いてもいいのですが、後でAdminにリンクを貼る際にこのディレクトリを使うので、先に作って関連するものをまとめておいたほうが便利です。

{% extends "admin/base_site.html" %}
{% block content %}
    Hello!
{% endblock %}

admin/base_site.htmlを継承することでAdminのヘッダーを付けることが出来ます。contentの部分をオーバーライドすれば好きなコンテンツを出力することが可能です。

既存のAdminページにリンクを貼る

独自ページを作成できたので、こんどはこちらにリンクを貼ってアクセスしやすくします。

これはリンクを置きたい管理ページのテンプレートを上書きすることで実現可能です。

{% extends "admin/change_form.html" %}
{% block pretitle %}
    <a href="/admin/app/hoge/my_view">Go to my_view</a>
{% endblock %}

例えばエンティティの追加・編集画面にリンクを作成したいときは、templates/admin/app/hoge/change_form.htmlを上書きすることでリンクを設置できます。pretitleというブロックはヘッダーの直下、タイトルの上の空間を利用できるので個別のフォームに対するものでなければここを上書きするといいでしょう。
リンクはreverse関数({% url %})を使ったほうが行儀がいいですが、Adminでそうページが変わるわけでもないので決め打ちしてます。get_urls内でも逆引き可能なのか気になります。

以上で、独自ページの作成と、そこへのリンク設定ができました。

Fri, 11 Mar 2016 02:23:03 +0000   |   Category:Python

関連記事

About Me

kimihiro-n

Androidアプリを中心にいろいろアプリ作ってます。
T N G

Products

放課後アプリ部
放課後アプリ部
個人アプリ開発者のための集客プラットフォーム作りました。 AndroidやiOSアプリのダウンロード数増加を無料で手伝います!

最速のJSON可視化・解析ツール
JSONを使った開発をスムーズにするためのツールです。 特定の値までのパスを簡単に取れます。
過去に作ったiOSアプリ
明日から本気出すタスク管理 for iOS
過去に作ったAndroidアプリ
明日から本気出すタスク管理 for Android Nagareboshi taplight
Others..

Search Articles