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 |