私が愛してやまない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 %}
....


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