↓もし、良かったらSNSでの紹介よろしくお願いします。

【Python】Django入門(簡単なメモアプリを作成)

bootstrap

前回はHello World!を表示するアプリを作成して、
インストールとviewの作成、パスの設定方法について確認しました。

https://www.tech-tech.xyz/python-django-tutorial1/

本記事では、データの作成、閲覧、編集、削除といったCRUD処理について学びます。
CRUDは、Create,Read,Upate,Deleteの頭文字です。

本記事でわかること

  • データの管理を行うmodelの作成方法
  • CRUD処理の実装方法
  • 管理者画面の使い方
  • フォームの作成方法

事前準備

本記事はDjango2.1.3を利用しています。

前回の記事を読んでない場合は、
つぎのコマンドで、プロジェクトを作成してください。

django-admin startproject sample_project

アプリを新規作成

フォームからメモのタイトルと内容を入力して
データベースに保存するアプリを作ります。

memoアプリを追加します。
プロジェクトのディレクトリsample_projectに移動して以下のコマンドを実行しましょう。

python manage.py startapp memo

つぎにDjangoにmemoアプリを登録します。
sample_project/sample_project/settings.py
INSTALLED_APPSにmemoを追加しましょう。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
        ...
    'memo',# この行を追加
]

memoモデルを作成

MVCというWebアプリでよく使われるデザインパターンでは、
データの構造を定義するクラスをモデルと呼びます。

Djangoではmodels.pyにモデルのクラスを定義します。
memoのデータ構造を表すMemoクラスを作成しましょう。
sample_project/memo/models.pyは次の通りです。

from django.db import models

class Memo(models.Model):
    title = models.CharField(max_length=20)
    content = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

データのフィールドを定義しています。

データベースにmemoモデルを反映する

Djangoでは、デフォルトでsqlite3を利用します。
sqlite3はDjangoをインストールしたときに付属してインストールされています。
なので、今回は、データベースの設定は不要です。

データベースへMemoクラスをテーブルに反映するマイグレーションファイルを作成します。

python manage.py makemigrations memo

以下のメッセージが表示されてマイグレーションファイルが作成されます。

Migrations for 'memo':
  memo\migrations\0001_initial.py
    - Create model Memo

マイグレーションファイルを作成するだけでは、DBに変更は反映されません。
以下のコマンドでマイグレーションファイルを反映します。

python manage.py migrate

管理者画面からCRUD処理を確認する

作成されたモデルを確認するために管理画面を利用しましょう。
管理画面では、モデルの作成、閲覧、編集、削除を行えるフォームが既に作成されています。

Djangoでは、Railsなどのフレームワークにあるscaffold機能がないので、
この管理画面を使って、データのCRUD処理を確認します。

管理画面はsample_project/memo/admin.pyで実装されています。
ここにmemoモデルを登録しましょう。

from django.contrib import admin
from .models import Memo

admin.site.register(Memo)

つぎに管理者を追加します。以下のコマンドを実行してください。

python manage.py createsuperuser

ユーザー名、パスワード、メールアドレスなどを聞かれるので適当に入力します。

python manage.py runserverでサーバーを起動して、
http://localhost:8000/admin
にアクセスしましょう。

先ほど設定したユーザー名とパスワードを入力してログインしましょう。

すると管理画面が表示されます。
Memoが登録されていることを確認しましょう。

addをクリックすると、Memo作成画面に遷移します。
フォームに適当なあたいを入力し、Saveを押すと新規メモに作成されます。

Memo objectを押すと、削除、編集ができます。
管理者はモデルのCRUD処理をひととおり行えることがわかります。

フォームを作成する

フォームを作成していきます。大きな流れはつぎのとおりです。

  1. フォームクラスを作成
  2. 内部の処理を記述
  3. フォームを表示するhtmlを作成
  4. パスを設定

フォームクラスを作成

sample_project/memo/forms.pyを以下のように記載します。

from django import forms
from .models import Memo

class MemoForm(forms.ModelForm):
    class Meta:
        model = Memo
        fields = ('title', 'content')

ここで、Metaクラスを定義しています。
モデルに紐づくフォームの場合に利用するクラスです。

内部処理を記述

sample_project/memo/views.pyにリクエストを受け取ったときの処理を書きます。

showメソッドでmemoを閲覧する機能を書いてます。
showメソッドはかなり簡素な作りになっています。

createメソッドには、
フォームを表示と受信したときの内部の処理を書きます。

from django.shortcuts import render
from django.http import HttpResponse
from .models import Memo
from .forms import MemoForm

# GETパラメータからidを取得して対応するMemoの情報を表示する
def show(request):
    memo_id = request.GET.get('id')
    memo = Memo.objects.get(pk=memo_id)
    return HttpResponse("%s:%s" % (memo.title,memo.content))

# GETの場合フォームを表示、POSTの場合memoを保存
def create(request):
    if request.method == 'GET':
        form = MemoForm()
        return render(request, 'create.html', {'form': form})
    elif request.method == 'POST':
        form = MemoForm(request.POST)
        if form.is_valid():
            memo = form.save(commit=False)
            memo.save()
            return redirect('/memo?id=%s' % memo.pk)

フォームを表示するhtmlを作成

つぎにテンプレートを作成します。
sample_project/memo/templatesディレクトリを作成しましょう。
renderメソッドで利用するテンプレートはtemplates以下から読まれるからです。
sample_project/memo/templates/create.htmlを作成し下記のように記載します。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>メモを作成</title>
  </head>
  <body>
    <h1>メモを作成</h1>
    <form method="POST">{% csrf_token %}
      {{ form.as_p }}
      <button type="submit">保存</button>
    </form>
  </body>
</html>

パスを追加

from memo import views as memo_views
urlpatterns = [
    ...
    path('memo',memo_views.show,name='memo'),
    path('memo/create',memo_views.create,name='memo'),
]

動作確認

http://localhost:8000/memo/create
にアクセスするとフォームが表示されます。適当に入力して保存を押しましょう。

作成したmemoのタイトルと内容が表示されれば成功です。

次の記事

https://www.tech-tech.xyz/python-django-layout/