Wagtailを触ってみた(2)。django-extensionsの導入。

#### はじめに
こんにちは。

Wagtailを使って開発を進めていきたいところですが、現状ではデバッグ等に必要なライブラリが何もインストールされていません。
デバッグで使えるDjangoのライブラリといえば、[django-extensions](https://django-extensions.readthedocs.io/en/latest/)か[django-debug-toolbar](https://django-debug-toolbar.readthedocs.io/en/latest/)などが挙げられますね。~~それしか知らないらしい~~

そこで今回は、django-extensionsを導入したので、その流れをまとめました。Djangoのライブラリについても調査してみたいと思います。

[前回の記事](https://qiita.com/a27yb/items/fe9c65dfc1084d3ee599)

---

#### django-extensionsの導入

django-extensionsの導入の流れについて書いておきます。
僕はmacでやりました。

まず、下記コマンドを実行します。

```shell
pip install django-extensions
```
次に、mysite/settings/base.pyのINSTALLED_APPSにdjango-extensionsを追記します。

これだけで基本機能は使えますが、一部使えないものがあります。
モデルのER図(後述)が生成できるコマンドがありますが、それにはいくつかの手順が必要でした。

```shell
brew install Graphviz
pip install pygraphviz
```
エラーが出てうまくいかなかったですが、このISSUEを見れば解決できました。
参考：[Cannot install pygraphviz on Mac OS 10.11.6](https://github.com/pygraphviz/pygraphviz/issues/100)

---

#### django-extensionsを試す
**□show_urls**
django-extensionsの機能はなかなか便利ですよ。
一つ目に紹介するものは、show_urlsです。

```shell
python manage.py show_urls
```
Djangoのプロジェクトに設定されているURLの「View」や「template」における関係が一覧となって表示されます。
この表現だとわかりにくいと思うので、まずは実行ログをみてみましょう。（一部抜粋）

```shell
/django-admin/login/    django.contrib.admin.sites.login        admin:login                                                                                                                                 
/django-admin/logout/   django.contrib.admin.sites.logout       admin:logout                                                                                                                                
/django-admin/password_change/  django.contrib.admin.sites.password_change      admin:password_change                                                                                                       
/django-admin/password_change/done/     django.contrib.admin.sites.password_change_done admin:password_change_done 
```
左側の/django-admin/login/などは、
http://localhost:8000/
の後に続くパス(URLパターン)を表しています。

中央のdjango.contrib.admin.sites.loginなどは、view関数の所在を表しています。
djangoのGithubで[django.contirib.admin.sites](https://github.com/django/django/blob/d4df5e1b0b1c643fe0fc521add0236764ec8e92a/django/contrib/admin/sites.py)を見てみましょう。login関数があることが分かりますね。

右側のadmin:loginなどはパスの名前を表しています。
url_patternsにURLを設定する時に、第三引数に

```python
name="hogehoge"
```
のように書きますよね。そのnameがこれに当たります。


試しに、一つview関数を追加して、それをshow_urlsを使って調べてみたいと思います。
参考サイトを元に、コードを書いていきます。
参考：[【Django入門】viewsを使ってページを表示させよう](https://www.sejuku.net/blog/25952)

追加したコードは下記の通りです。

```python:home/views.py
from django.http import HttpResponse
 
def index(request):
    return HttpResponse("Hello, world.")

```

```python:home/urls.py

from django.conf.urls import url
from . import views
 
urlpatterns = [
    url(r'^$', views.index, name='index'),
]

```

```python:mysite/urls.py
from home import views as home_views # 上部に追記

url(r'^home/', include('home.urls')) # urlpatternsのリスト内に追記
```
[ここ](http://localhost:8000/home/)をクリックしてHello, world.が表示されたらOKです。

では、下記のコマンドを実行してみましょう。

```shell
python manage.py show_urls | grep home
```

```shell
/home/  home.views.index        index
```
表示されましたね。
viewをインポートするときやテンプレートにURLを記入するときなどで重宝します。
参考：[DjangoアプリのURLリンクの貼り方とメリット](https://hodalog.com/how-to-add-url-link-in-django/)

**□ER図**
参考：[ER図（Entity Relationship Diagram）](http://itref.fc2web.com/technology/entity_relationship_diagram.html)
django-extensionsではコマンド一つでプロジェクトのER図をpngで生成できます。
データベース設計の時に使える優れものです。
では、コマンドを実行して確認してみましょう。

```shell
python manage.py graph_models -a -o mysite_er.png
```
同ディレクトリ上にmysite_er.pngが生成されていると思います。
![er.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517540/38c67955-e24a-dc85-f79b-fd80cca621c2.png)
　　　　　　　　　　　　　　　　　　　　　　ER図

**□runserver_plus**
今回はもう一つ紹介しておきます。
デバッグをWebブラウザ上で実行できる優れものです。
早速コマンドを実行してみましょう。

```shell
python manage.py runserver_plus
```
すると、、

```shell
CommandError: Werkzeug is required to use runserver_plus.  Please visit http://werkzeug.pocoo.org/ or install via pip. (pip install Werkzeug)
```
**言われるがままにWekzeugをインストールして再挑戦です。**

普通のrunserverとなんか違いますね。
ログの最終行にこのようなものがあります。
これを後から使うのでメモしておきましょう。

```shell
 * Debugger PIN: xxx-xxx-xxx
```
では、下記のようにコードを編集してみましょう。

```home/views.py
return HttpReesponse("Hello, world.") # わざと間違える
```

<img width="1402" alt="スクリーンショット 2019-12-24 19.30.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517540/698f368e-c772-a990-dcfa-8f50aabf57c5.png">
          　　　　　　　　　　　　　　　　　　　　エラー画面

<img width="1384" alt="スクリーンショット 2019-12-24 19.31.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517540/fb625c8a-bae7-84d2-2795-9b581a7b3723.png">
　　　　　　　　　　　　　　　　　　　エラー画面下部

右側にターミナルのようなボタンがあります。
そこをクリックして、先ほどメモしたPINコードを記入すればデバッグが可能です。
Pythonのコードが対話的に実行できるので、変数などのオブジェクトの値が調べられますね。

---
#### さいごに
今回は、django-extensionsをプロジェクトに導入してみました。
次こそはWagtailを触っていきたいと思います。