このページを正しく表示するにはJavascriptを有効にしてください。
DjangoAdminに独自ページを追加する
DjangoAdminに独自のページを定義して、管理画面にリンクを貼るまでのメモ。
独自ページが作れるようになるとだいぶDjangoAdminの自由度が広がります。
## 環境
* Python3
* Django 1.9
## 実装手順
1. 独自ページを作成する
1. URLの登録
1. Viewの作成
1. Templateの作成
2. 既存のAdminページにリンクを貼る
### 独自のページを作成する
[https://docs.djangoproject.com/ja/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls](https://docs.djangoproject.com/ja/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls)
ここにある手順でDjangoに独自ページを拡張できます。
#### URLの登録
まずDjangoAdminを定義してるクラスに独自ページのURL定義をします。
```python3
# 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を実装します。
```python
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にリンクを貼る際にこのディレクトリを使うので、先に作って関連するものをまとめておいたほうが便利です。
```j2
{% extends "admin/base_site.html" %}
{% block content %}
Hello!
{% endblock %}
```
admin/base_site.htmlを継承することでAdminのヘッダーを付けることが出来ます。contentの部分をオーバーライドすれば好きなコンテンツを出力することが可能です。
### 既存のAdminページにリンクを貼る
独自ページを作成できたので、こんどはこちらにリンクを貼ってアクセスしやすくします。
これはリンクを置きたい管理ページのテンプレートを上書きすることで実現可能です。
```html
{% extends "admin/change_form.html" %}
{% block pretitle %}
Go to my_view
{% endblock %}
```
例えばエンティティの追加・編集画面にリンクを作成したいときは、`templates/admin/app/hoge/change_form.html`を上書きすることでリンクを設置できます。`pretitle`というブロックはヘッダーの直下、タイトルの上の空間を利用できるので個別のフォームに対するものでなければここを上書きするといいでしょう。
リンクはreverse関数(`{% url %}`)を使ったほうが行儀がいいですが、Adminでそうページが変わるわけでもないので決め打ちしてます。get_urls内でも逆引き可能なのか気になります。
以上で、独自ページの作成と、そこへのリンク設定ができました。