願望
汎用ビューを使って効率良くWEBサイトを作りたい。
要するに楽したい。
環境
mac
python3.7.3
anaconda
vagrant
django2.2.1
前回やったこと
TemplateViewを使用して簡単にテンプレートを表示する。
ListViewを使用してデータをリスト形式で表示する。
今回やりたいこと
-
汎用ビューを使って詳細ページの作成
-
汎用ビューを使ってレコードを作成するページの作成
1. 汎用ビューを使って、詳細ページを作る
viewsで汎用ビューを継承したクラスを作成
DetailViewを継承すると詳細ページを楽に作成出来る。
viewtest/home/views.py
from django.views import generic
from .models import User
class UserDetailView(generic.DetailView):
model = User
# modelを指定
template_name = 'home/detail.html'
# テンプレートを指定
urlsに汎用ビューとしてURLと紐づける
viewtest/home/urls.py
...略^o^
urlpatterns = [
...
path('users/<int:pk>/', views.UserDetailView.as_view(), name='detail'),
# usersページに <a href="{% url 'home:detail' user.pk %}"></a>を設置しIDから情報を取得。
]
今回表示させる適当な詳細ページ
viewtest/home/templates/home/detail.html
{% extends 'home/base.html' %}
{% block content %}
<h1>{{ object.username }}</h1>
<!-- object.フィールド名 でデータを受け取る !-->
<p>SEX : {{ object.sex }}</p>
<p>AGE : {{ object.age }}</p>
{% endblock %}
前回作ったusers.htmlに aタグを挿入〜
viewtest/home/templates/home/users.html
...略^ー^
<ul>
{% for user in object_list %}
<li><p><a href="{% url 'home:detail' user.pk %}">{{ user.username }}</a> - {{ user.sex }} ({{ user.age }})</p></li>
{% empty %}
<li><p>No Users yet</p></li>
{% endfor %}
</ul>
...略^w^
これで簡単な詳細ページはOK。
これもまた既存メソッドをオーバーライドすれば色々出来るらしい。
2. 汎用ビューを使ってレコード登録するページの作成
viewsで継承
CreateViewを継承するとフォーム関連を楽に作れる。
viewtest/home/views.py
from .models import User
from django.views import generic
from django.urls import reverse_razy
...略^u^
class UserCreateView(generic.CreateView):
model = User
# modelを指定
fields = '__all__'
# createviewは使用するfieldsを指定する必要がある。
# この場合はmodelsで定義した、username, sex, ageのフォームが作られる。
# 指定したい場合はリストとかでフィールド名指定
template_name = 'home/create.html'
success_url = reverse_razy('home:users')
# 成功した時飛ばすURLを指定する。reverse_razyはクラス内でurls.pyを参照するんだっけか。
また、
CreateViewには、form_valid()
form_invalid()
といったメソッドが用意されていて、バリデーションの成功、失敗によって動作を実装出来る。
urlsに汎用ビューとしてURLと紐づける
viewtest/home/urls.py
...略^o^
urlpatterns = [
...
path('create/', views.UserCreateView.as_view(), name='create'),
]
今回表示させる適当な入力ページ
viewtest/home/templates/home/create.html
{% extends 'home/base.html' %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p}}
<!-- {{ form }} でもいけるけど、as_pにすると1個1個にpタグ付けて出力してくれるみたい !-->
<input type="submit" value="createuser">
</form>
{% endblock %}
こりゃ楽だ〜
結果
汎用ビューに興奮しすぎて眠れない
続く