1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Django 汎用ビュー入門2

Last updated at Posted at 2019-07-16

願望

汎用ビューを使って効率良くWEBサイトを作りたい。

要するに楽したい。

環境

mac
python3.7.3
anaconda
vagrant
django2.2.1

前回やったこと

TemplateViewを使用して簡単にテンプレートを表示する。

ListViewを使用してデータをリスト形式で表示する。


今回やりたいこと

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

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


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 %}

こりゃ楽だ〜


結果

汎用ビューに興奮しすぎて眠れない

続く


1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?