Django(pythonのWebフレームワーク)で、本のCRUDを作ってみた。
Djnago(pythonのlaravelみたいなWebフレームワーク)入門。標準でadmin機能があって、モデル追加すると管理画面に反映できる!
1, Djangoプロジェクト生成 & bookアプリ(機能)生成
| 1 2 3 | django-admin startproject bookproject cd bookproject python manage.py startapp books | 
Djangoの「アプリ」は機能単位のモジュールで、以下のような役割を担う機能のまとまりです。
パーツ化することによって再利用や個別開発しやすいようにしている。
モデル(データ構造)
ビュー(ロジック)
テンプレート(HTML)
URLルーティング
管理画面(admin)
※紛らわしいので「ミニアプリ」とか「機能モジュール」とかにして欲しい
bookproject/settings.py
| 1 2 3 4 | INSTALLED_APPS = [     # 既存のアプリ     'books',  # ← 追加 ] | 
2, books/models.py にテーブル定義を書く
| 1 2 3 4 5 6 7 8 9 10 | from django.db import models class Book(models.Model):     title = models.CharField(max_length=200)  # 本のタイトル     author = models.CharField(max_length=100)  # 著者     published_date = models.DateField()  # 出版日     description = models.TextField(blank=True)  # 説明(省略可能)     def __str__(self):         return self.title | 
3, DBのテーブル作成
| 1 2 3 4 | # models.pyからマイグレーションファイル(0001_initial.py)を生成するコマンド python manage.py makemigrations # マイグレーションファイル(0001_initial.py)を元に、DBのテーブル作成 python manage.py migrate | 
マイグレーションファイルは、モデルの付属物扱いだから、0001_initial.pyみたいな素っ気ない通し番号で管理しているんだ
4,  books/views.py にCRUDロジックを実装
laravelのcontroller。laravelのviewsは、DjangoではTemplate
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | from django.shortcuts import render, redirect, get_object_or_404 from .models import Book from .forms import BookForm # 一覧表示 def book_list(request):     books = Book.objects.all()     return render(request, 'books/book_list.html', {'books': books}) # 新規作成 def book_create(request):     if request.method == 'POST':         form = BookForm(request.POST)         if form.is_valid():             form.save()             return redirect('book_list')     else:         form = BookForm()     return render(request, 'books/book_form.html', {'form': form}) # 編集 def book_update(request, pk):     book = get_object_or_404(Book, pk=pk)     form = BookForm(request.POST or None, instance=book)     if form.is_valid():         form.save()         return redirect('book_list')     return render(request, 'books/book_form.html', {'form': form}) # 削除 def book_delete(request, pk):     book = get_object_or_404(Book, pk=pk)     if request.method == 'POST':         book.delete()         return redirect('book_list')     return render(request, 'books/book_confirm_delete.html', {'book': book}) | 
5, books/forms.py にWebフォームを定義
モデルから自動生成できる(日本語化やカレンダー入力は指定する必要がある)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from django import forms from .models import Book class BookForm(forms.ModelForm):     class Meta:         model = Book         fields = '__all__'         labels = {             'title': 'タイトル',             'author': '著者',             'published_date': '出版日',             'description': '説明',         }         widgets = {             'published_date': forms.DateInput(                 attrs={'type': 'date'}             )         } | 
6, Templateファイル(HTMLなど見た目部分)を作成
forms.py
入力項目(フィールド)の定義
バリデーションロジック(例:必須、形式チェック)
初期値、ラベルなど
※新規作成と更新で、使い回せるって事
templates/
レイアウト(見た目)
Bootstrapなどの装飾、説明文、フォームの順番
templates/books/book_list.html
| 1 2 3 4 5 6 7 8 9 10 11 | <h1>本の一覧</h1> <a href="{% url 'book_create' %}">新しい本を追加</a> <ul>   {% for book in books %}     <li>       {{ book.title }} ({{ book.author }})       <a href="{% url 'book_update' book.pk %}">編集</a>       <a href="{% url 'book_delete' book.pk %}">削除</a>     </li>   {% endfor %} </ul> | 
templates/books/book_form.html
| 1 2 3 4 5 6 7 | <h1>本の登録・編集</h1> <form method="post">   {% csrf_token %}   {{ form.as_p }}   <button type="submit">保存</button> </form> <a href="{% url 'book_list' %}">戻る</a> | 
templates/books/book_confirm_delete.html
| 1 2 3 4 5 6 7 | <h1>削除の確認</h1> <p>「{{ book.title }}」を本当に削除しますか?</p> <form method="post">   {% csrf_token %}   <button type="submit">削除</button> </form> <a href="{% url 'book_list' %}">キャンセル</a> | 
7, 管理者ユーザー作成(IDとパスワードを設定)
/adminで管理画面が最初から用意されている。
| 1 | python manage.py createsuperuser | 
8, 簡易Webサーバで確認
| 1 | python manage.py runserver | 
9, urls.pyでURLルーティングが抜けていた。
books/urls.py
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # Djangoのpath関数と、自作のviewsモジュールをインポート from django.urls import path from . import views # アプリ内のURLパターンを定義 urlpatterns = [     # 一覧ページ: http://.../books/     path('', views.book_list, name='book_list'),     # 新規作成ページ: http://.../books/create/     path('create/', views.book_create, name='book_create'),     # 編集ページ: http://.../books/1/update/     path('<int:pk>/update/', views.book_update, name='book_update'),     # 削除ページ: http://.../books/1/delete/     path('<int:pk>/delete/', views.book_delete, name='book_delete'), ] | 
親のbookproject/urls.pyにも記述
| 1 2 3 4 5 6 7 8 9 | from django.contrib import admin from django.urls import path,include urlpatterns = [     path('admin/', admin.site.urls),     # booksアプリのURLをルートに追加     # 例: http://.../books/ にアクセスしたら、books.urls に処理を委譲     path('books/', include('books.urls')), ] |