Django汎用ビュー雛形自動生成パッケージを作ってみた

# 汎用ビューを使う
## 汎用ビューって便利
関数ベースのビューを使うときには、フォームやらレンダリングなど、全部命令しないといけません。
しかし、汎用ビュー（クラスベース汎用ビュー）なら、テンプレートを表示するときにもこれだけの記述で書けちゃいます。
そして何より、ビューをパッと見たときの処理が直感的に分かりやすいので、コードが読みやすくなります。

### 関数ビューの場合
```views.py
from django.shortcuts import render


def top(request):
    return render(request, 'top.html')
```
```urls.py
urlpatterns = [
    path('top', top())
]
```

### 汎用ビューの場合
```views.py
from django.generic.views import TemplateView


class TopView(TemplateView):
    template_name = 'top.html'
```

```urls.py
urlpatterns = [
   path('top', TopView.as_view())
]
```

## 汎用ビューを使うときの問題点
Djangoの汎用ビュー（TemplateViewとかDetailViewとか）を使う時って、メソッドがあらかじめ組み込まれているのは良いのですが、毎回実装するときにはドキュメントを見に行って、コピペしますよね。
例えば、TemplateViewを使いたいときには、ドキュメントから `get_context_data` をコピーしてきたり。

```views.py
class TopView(TemplateView):
    template_name = 'top.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Welcome!'  # htmlで{{ title }}を使えるようにする
        return context
```

これがFormViewになると、 `form_valid`メソッドが必要だったり、 `get_success_url`メソッドが必要だったりと、組み込みたい処理ごとにドキュメントを行ったり来たりするのは面倒ですよね。


# 汎用ビュー自動生成パッケージ: dj-cref
そんなわけで、汎用ビュー自動生成パッケージを作りました。

## 何をするのか
`dj-cref`コマンドによって、汎用ビューの雛形を自動的に出力します。
これによって、ここで出力されたものをファイルに追加することで、ドキュメントを見に行かなくても汎用ビューを書き始められます。

```
$ dj-cref -type ListView
class MyListView(ListView):
    # template_name = 'my_template.html'
    # model = 'MyModel'
    # allow_empty = True
    # paginate_by = 10

    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request, *args, **kwargs)
        # please implement here

    def get_queryset(self):
        queryset = self.get_queryset()
        # please implement here
        return queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # please implement here
        return context
```

## 使い方
### インストール
```
$ pip install dj-cref
```

### 汎用ビュー自動生成
```
$ dj-cref -type 汎用ビューの種類 --initial
```
こうすることで、指定した種類の汎用ビューの雛形を標準出力に出力します。
今の所、サポートしている汎用ビューの種類は下記の通りです。

* View
* FormView
* CreateView
* UpdateView
* DetailView
* DeleteView
* TemplateView
* ListView
* RedirectView

また、 `--initial`オプションをつけることで、汎用ビューの種類に相当するimport文も併せて出力してくれます。

### 使用例
#### ケース1: import文と一緒に出力
```
$ dj-cref -type DetailView --initial
from django.views import DetailView


class MyDetailView(DetailView):
    # template_name = 'my_template.html'
    # model = 'MyModel'

    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request, *args, **kwargs)
        # please implement here

    def get_queryset(self):
        queryset = self.get_queryset()
        # please implement here
        return queryset

    def get_object(self, queryset=None):
        obj = self.get_object(queryset)
        # please implement here
        retur obj

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # please implement here
        return context
```

#### ケース2:ファイル内に雛形を追加する
```
$ dj-cref -type ListView >> views.py
$ cat views.py
...
class MyListView(ListView):
    # template_name = 'my_template.html'
    # model = 'MyModel'
    # allow_empty = True
    # paginate_by = 10

    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request, *args, **kwargs)
        # please implement here

    def get_queryset(self):
        queryset = self.get_queryset()
        # please implement here
        return queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # please implement here
        return context
```

# 最後に
汎用ビュー雛形自動生成パッケージを紹介しました。
まだまだ出来たばかりで、使いにくい部分もたまにあるかと思います。
もしご意見等あったらいただけますと幸いです。
[Github](https://github.com/Canon11/dj-cref)