CRUDを実装する(CRUDのR)
はじめに
前回の続き↓で本棚アプリケーションを作成していきます。
urhayataro.hatenablog.com
CRUDの実装を行い、webページのレイアウトを整えていきます。
今回メインで行うのは、CRUDのRであるwebサイトからの読み込みの実装です。
CRUDとは
CRUDとはwebサイトでユーザーが行う動作のことであり、以下の頭文字をとったものです。
- C - Create
- R - Read
- U - Update
- D - Delete
Cは作成する、投稿する、Rは読み込む、Uは更新する、Dは削除するという意味となっています。
Djangoではviews.pyでクラスの継承を用いてCRUDの実装をします。対応しているViewは、以下のようになります。
- C - CreateView
- R - ListView, DetailView
- U - UpdateView
- D - DeleteView
以上のviewを継承することでこれからCRUDを実装していきます。
本の一覧画面の作成
まず、本の一覧を表示するListViewという画面を作成していきます。
ListViewはCRUDでいうR(読み込み)の所です。
はじめにbook/urls.pyに以下の記述をします。
from django.urls import path from . import views urlpatterns = [ path('book/', views.ListBookView.as_view()), ]
pathで書いてあるように、urlにbook/が含まれていると、views.pyでListBookViewと定義されたviewを呼び出すようにしています。
では次にviews.pyでListBookViewを定義しています。
from django.shortcuts import render from django.views.generic import ListView from .models import Book class ListBookView(ListView): template_name = 'book/book_list.html' model = Book
それから、book/models.pyも書き込んでいきます。本棚アプリケーションで必要となる、本のタイトル、内容、カテゴリーといった情報を扱えるようにします。
from django.db import models # Create your models here. CATEGORY = (('business', 'ビジネス'), ('life', '生活'), ('other', 'その他')) class Book(models.Model): title = models.CharField(max_length=100) text = models.TextField() category = models.CharField( max_length=100, choices = CATEGORY )
CATEGORYについては適当に何でも構いません。クラスBookはmodelsモジュールのModelクラスを継承するようにします。
そして、結果を管理画面で見ていくため、モデルを反映させます。book/admin.pyに以下の記述をしていきます。
from django.contrib import admin from .models import Book # Register your models here. admin.site.register(Book)
ここまでできれば前回学んだ以下のコマンドを実行してみます。
python3 manage.py makemigrations python3 manage.py migrate
できれば以下のような画面が表示されます。
それからサーバーを立てて、管理画面の表示をしていきます。
python3 manage.py runserver
立ち上げられたら127.0.0.1:8000/admin/にアクセスします。すると、管理画面にBooksが追加されています。
これで、Booksの横の+Addを押して、適当な本のデータを追加してみます。すると管理画面は以下のようになります。
ただBook object(1)のようになっており、このままでは何の本かわかりません。
ここには本のタイトルを表示させたいので、book/models.pyに以下の記述を追加します。
from django.db import models # Create your models here. CATEGORY = (('business', 'ビジネス'), ('life', '生活'), ('other', 'その他')) class Book(models.Model): title = models.CharField(max_length=100) text = models.TextField() category = models.CharField( max_length=100, choices = CATEGORY ) def __str__(self): # 追加 return self.title # 追加
__str__とすることで、オブジェクトの文字列を返すようにしています。また、selfを引数にとり、self.titleを返すことでオブジェクトのタイトルを返すようにしています。これでブラウザを再読み込みして、タイトルが書かれていれば成功です。
では今度はhtmlを使い、データの一覧(タイトル、内容、カテゴリー)を表示させます。
まず、templatesというディレクトリでhtmlファイルを作成していきます。このディレクトリはbookproject/book/に作成し、その中でbook_list.htmlファイルを作成します。
cd ~/bookproject/book mkdir templates cd templates mkdir book touch book_list.html
ファイルの作成ができれば、book/templates/book_list.htmに以下の記述をします。
{% for item in object_list %} <ul> <li>{{ item.title }}</li> <li>{{ item.text }}</li> <li>{{ item.category }}</li> </ul> {% endfor %}
1行目と最終行目はfor文のようなもので、中にあるitemのタイトル、内容、カテゴリーを全て表示させるような記述となっています。
また、タグを用いて見た目を少し整えるようにしています。
これでサーバーを立ち上げ、今度は127.0.0.1:8000/book/にアクセスします。
先程適当に本棚アプリケーションに追加した、タイトル、内容、カテゴリーが一覧で表示されていれば成功です。
本の詳細ページの作成
次に、ListViewと同じくCRUDのR(読み込み)であるDetailViewを作成していきます。
はじめに、book/urls.pyに以下を追加します。
from django.urls import path from . import views urlpatterns = [ path('book/', views.ListBookView.as_view()), path('book/<int:pk>/detail', views.ListBookView.as_view()), # 追加 ]
ここで追加したところの
これは、int primarykeyの略でデータベースがデータを特定するときに使うものです。空でも重複しているわけでもないデータを整理するためのキーであり、前回の記事のモデルの作成で説明した図のidの部分を指します。
それからListViewと同じように、book/views.pyにも以下を追加します。
from django.shortcuts import render from django.views.generic import ListView, DetailView # 追加 from .models import Book # Create your views here. class ListBookView(ListView): template_name = 'book/book_list.html' model = Book class DetailBookView(DetailView): # 追加 template_name = 'book/book_detail.html' # 追加 model = Book # 追加
次にbook_list.htmlと同じ場所にbook_detail.htmlの作成をします。
touch book/templates/book/book_detail.html
作成したファイルにhtml記述をしていきますが、今回は本ごとの詳細を読み込みたいので、book_listとは違い、for文が不要です。
ではbook_detail.htmlに以下の記述をします。
{{ object.catefory }} {{ object.title }} {{ object.text }}
できれば、127.0.0.1:8000/adminにアクセスします。そして、適当な本を選択します。
本を選択してidを確認します。idの確認はurlを見ます。127.0.0.1:8000/admin/book/book/id/change/となっているところのidを見ます。具体的には1や2などの数字が入っているはずです。
このidを確認して127.0.0.1:8000/book/id/detailにアクセスします。するとそのidの本のカテゴリー、タイトル、内容が一行に表示されます。
これで本の詳細ページも読み込むことができました。