【Django】Adminにページを追加して最強の管理画面に

django-admin-add-url-title CODE

私が愛してやまないDjango管理画面ですが、自作したページも簡単に追加できます。

自作アクションの確認画面やモデルにはないフィールドのフォーム画面を作成する場合に便利です。

本記事ではAdminサイトに自作ページを追加して遷移するまでの方法を紹介します。

なお、この記事で使うPython・Djangoのバージョンは以下のとおりです。

Python 3.7
Django 2.2.5

1.URLを追加

from django.contrib import admin

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super().get_urls()  # デフォルトのadmin urlを呼び出す
        # 追加したいURLと対応するビューを記述
        add_urls = [
            path('add_page/', self.admin_site.admin_view(self.add_view), name="add_page"),
        ]
        return add_urls + urls  # 自作ページのURLを追加。必ずadd_urlsを前に!

 get_urls ではURLconfと同じように独自のURLをModelAdminに対して設計できます。

 get_urls  で定義したURLは  admin/アプリ名/モデル名/ 配下に設計されます。

この場合だと、 /admin/app/book/add_page となります。 

 

returnの順番は追加するURLの配列を必ず前に!

Admin標準のURLが優先されて追加したURLのビューに辿りつかないからです。

 self.admin_site.admin_view でラップするとキャッシュの無効化と権限のチェックをやってくれます。

 

2.Viewを追加

これは普通のビューと何も変わりません。

 get_urls  self.add_view としているので、BookAdminの get_urls の下にビューを追加します。

def get_urls(self):
    ....
    return add_urls + urls

# Viewを追加
def add_view(self, request):
    return TemplateResponse(request, "admin/app/book/add_page.html")

ただ  admin/app/book/add_page.html に遷移するだけのビューです。

 

3.Templateを追加

ビューが呼ぶテンプレートを追加します。

 app/templates/ 配下に  admin/app/book/ という階層を作成し、そこにadd_page.htmlを作成します。

{% extends "admin/base_site.html" %}
{% block content %}
    追加ページ
{% endblock %}

中身は「追加ページ」という文字を表示するだけのものです。

これで  /admin/app/book/add_page を叩けば、自作ページに遷移する導線ができました。

 

4.Adminにリンクを追加

最後に /admin/app/book/add_page へのリンクをサイトに追加します。

今回は、Bookモデルの一覧画面にリンクを追加します。

一覧画面の編集はchange_list.htmlを上書けばできます。

今回はBookモデルのみにリンクを貼りたいので  templates/admin/app/book 内にchange_list.htmlを作成して編集します。

...
{% block content %}
<span><</span><span>a </span><span>href</span><span>=</span>"/admin/app/book/add_page">追加ページへ<span><</span><span>/a></span>
# reverse関数で逆引きするなら、 <span><</span><span>a </span><span>href</span><span>=</span>"{% url 'admin:add_page' %}">追加ページへ<span><</span><span>/a></span>
...
{% endblock %}
....
DjangoAdmin追加ページ1
DjangoAdmin追加ページ2

無事自作したページに遷移できました。