Django 汎用ビュー入門3

##今日の野望
汎用ビューを使って効率良くWEBサイトを作りたい。

##環境
mac
python3.7.3
anaconda
vagrant 
django2.2.1
 
##前回やったこと

DetailViewを使用して簡単に詳細ページを作成する。

CreateViewを使用して簡単にフォームを作成する。

<br>


##今回やりたいこと

1. 汎用ビューを使って更新ページの作成

2. 汎用ビューを使ってレコードを削除するページの作成

<br>


###1. 汎用ビューを使って、更新ページを作る



####viewsで汎用ビューを継承したクラスを作成

UpdateViewを継承すると更新ページを楽に作成出来る。

```viewtest/home/views.py
from django.views import generic
from .models import User
from django.urls import reverse_lazy
from .forms import UpdateForm

...

class UserUpdateView(generic.UpdateView):
    model = User
    # modelを指定

    template_name = 'home/update.html'
    # テンプレートを指定

    form_class = UpdateForm
    # formsで定義したフォームを使える。ModelFormを継承すると、モデルデータからフォームを作ってくれる。

    success_url = reverse_lazy('home:users')
```




####urlsに汎用ビューとしてURLと紐づける

```viewtest/home/urls.py

...略^o^

urlpatterns = [
...
    path('update/<int:pk>/', views.UserUpdateView.as_view(), name='update'),
]

```

####フォームを定義する。

```forms.py
from django import forms
from .models import User


class UpdateForm(forms.ModelForm):

    username = forms.TextInput(attrs={
        'placeholder': 'username',
        'id': 'username',
        'name': 'username'
    })

    age = forms.TextInput(attrs={
        'placeholder': 'age',
        'id': 'age',
        'name': 'age'
    })


    sex = forms.TextInput(attrs={
        'placeholder': 'sex',
        'id': 'sex',
        'name': 'sex'
    })

    class Meta:
        model = User
        fields = ['username', 'age', 'sex']
    # Metaクラスで表示フィールド、使用モデルを定義する。
    # attrsとかでid,nameを指定してcss等から操作出来る。

```



####今回表示させる適当な更新ページ


```viewtest/home/templates/home/update.html

{% extends 'home/base.html' %}

{% block content %}
<form action="" method="post">
    {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="updateuser">
</form>
{% endblock %}

```

前回作ったdetail.htmlに エディットボタンを挿入〜

```viewtest/home/templates/home/detail.html

{% extends 'home/base.html' %}

{% block content %}
<h1>{{ object.username }}</h1>

<p>SEX : {{ object.sex }}</p>
<p>AGE : {{ object.age }}</p>

<p><a href="{% url 'home:update' object.id %}">edit</a></p>

{% endblock %}

```

これだけで完成。

<br>



###2. 汎用ビューを使ってレコード削除ページの作成




####viewsで継承

DeleteViewを継承

```viewtest/home/views.py

...

class MyDeleteView(generic.DeleteView):
    model = User

    success_url = reverse_lazy('home:users')
    
    # テンプレート名指定しない場合はデフォルトで、
    # app名/model名_confirm_delete.htmlを探した。
    # 他のテンプレートも決められてるらしい。
```




####urlsに汎用ビューとしてURLと紐づける

```viewtest/home/urls.py

...

urlpatterns = [
...
    path('delete/<int:pk>/', views.MyDeleteView.as_view(), name='delete'),
]

```

####detail.htmlに削除ボタン追加

```viewtest/home/templates/home/detail.html
...

<p><a href="{% url 'home:delete' object.id %}">delete</a></p>

...
```



####今回表示させる削除ページ

```viewtest/home/templates/home/home_.html

{% extends 'home/base.html' %}

{% block content %}
<h1>Delete</h1>
<p>Are you sure?</p>
    <form action="" method="post">
　　　　　{% csrf_token %}
        <input type="submit" value="delete">Delete
    </form>

<p><a href="javascript:history.back()">&lt; 戻る</a></p>

{% endblock %}

```


<br>

終わり

#最後に

これで汎用ビューは一通り終えた。
あとは、ドキュメント見ながら詳しい機能追求していきます。
何か面白い機能みっけたら更新していきま〜す。

<br>