Python

Django超入門 | 初心者でも1時間でWebアプリ(Todoアプリ)を作成するコース

Django 超入門 Todo

こんにちは、はやたす(@hayatasuuu )です。

この記事では、PythonのWebフレームワーク「Django」を使ってWebアプリ(Todoアプリ)を作成する方法を紹介します。

おそらく、あなたはこんな状況ではないでしょうか?

  • Pythonを使って、Webアプリを開発してみたい
  • とりあえず、最も基本的なアプリケーションを作ってみたい
  • しかも、初心者でも分かるくらい丁寧に解説してほしい

安心してください。この記事に沿って学習すれば、たとえ初心者だとしても、このようなWebアプリ(Todoアプリ)を開発できるようになります。

»

しかも、たったの1時間だけで、です。

もし他の学習リソースで理解できなかったなら、ぜひこの記事を参考にしてみてください。

元スクール講師であり、YouTubeで2.4万人以上にプログラミングを教えている僕が丁寧に解説していきます。

Contents

前提 | Djangoとは?Djangoでアプリ開発するのに必要な知識

 

Django(ジャンゴ)とは?

 

 

このチュートリアルで必要になる知識

 

 

STEP1 : Djangoアプリ作成の準備をする

さて、さっそくDjangoを使ってアプリを開発していきましょう。細かいことは後回し。まずは作ってみることが重要です。

STEP1では、Djangoでアプリ開発するための準備をします。

紹介するトピックは次のとおりです。

  • プロジェクトフォルダの作成
  • 必要なライブラリのインストール

一緒に手を動かしていきましょう。

プロジェクトフォルダの作成

今回のアプリ開発で使うプロジェクトフォルダを作成しましょう。

なるべく前提を合わせたいので、こだわりがなければDesktopでdjangotodoというフォルダを作ります。

django-todo-tutorial1

ターミナル操作に慣れていたら、以下のコマンドを実行しましょう。

$ cd Desktop && mkdir djangotodo

 

作成が完了したら、VSCodeでプロジェクトフォルダを開きます。

django-todo-tutorial2

※僕の画面では.devcontainerというフォルダがありますが気にしないでください!

ここまで完了したら、次からはVSCodeのターミナルを使って、色々と操作していきましょう。

必要なライブラリのインストール

このチュートリアルでは、Python3.9を使っていきます。

$ python -V
# --> Python 3.9.6

 

Pythonのバージョンは、3.6以降であれば問題ありません。それより古いと最新のDjangoがサポートされていないので注意してください。

Pythonのバージョンが3.6以上であれば、さっそくDjangoインストールしていきます。

僕のPython環境では、まだライブラリが何も入っていません。

django-todo-tutorial3

もし同じ環境を準備したいなら、仮想環境の利用を考えてください。今回のチュートリアルでは、話を簡単にするため仮想環境を準備しないで、とりあえず前に進もうと思います。

まずは、先ほど警告が出ていたので、pipのバージョンを上げておきます。もし同じ警告が出ていたら、以下のコマンドをターミナルで実行しましょう。

$ pip install --upgrade pip

 

django-todo-tutorial4

画像ではまだ警告が出ていますが、もう一度ライブラリ一覧を確認すると、しっかりバージョンアップできてることが分かります。

django-todo-tutorial5

次にDjangoをインストールしていきます。以下のコマンドをターミナルに入力しましょう。

$ pip install django

 

コマンドを実行すると、Djangoのインストールが始まります。

django-todo-tutorial6

最終的には、こんな感じの画面になるはずです。

django-todo-tutorial7

さて。インストールできたら、STEP1は完了です!念の為、最後に今回使っていくDjangoのバージョンを見ておきます。そのためには、以下のコマンドをターミナルに入力します。

$ python -m django --version

 

このチュートリアルで使うDjangoのバージョンは、記事を書いている2021/8/15時点で3.2.6です。

django-todo-tutorial8

もし動作がうまくいかないなら、バージョンをあわせてDjangoをインストールしましょう。

$ pip install django==3.2.6

 

これで準備完了です。

STEP2 : Djangoアプリ作成の初期設定をおこなう

STEP1でDjangoのインストールまで完了しました。STEP2では、Djangoでアプリ開発するための初期設定をおこないます。

Djangoではあらかじめアプリ開発に必要なパーツを準備してくれています。

だから自分が作りたいアプリに合わせて、設定を少し変更するだけで土台の部分が完成するんです。

そんな初期設定を済ませるために、STEP2では以下のトピックを紹介します。

  • Djangoプロジェクトを開始する
  • サーバーを立ち上げてロケットを飛ばす
  • アプリを作成する
  • 初期設定をおこなう

それでは順番に見ていきましょう。

Djangoプロジェクトを開始する

Djangoでアプリ開発するとき、”プロジェクト”を開始する必要があります。今回は「Djangoを使ってTodoアプリを作る」っていうプロジェクトですね。

プロジェクト名はなんでも大丈夫です。もしアプリ名が決まっているなら、その名前をつけるのも良いですね。ここではdjangotodoという名前のプロジェクトを作成していきます。

そのために、以下のコマンドをターミナルに入力しましょう。djangotodoという名前でプロジェクトを開始するという意味です。

$ django-admin startproject djangotodo .

 

このコマンドを実行しても、ターミナル上では何の変化もありません。でもよくみると、新しいファイルとフォルダが作成されているはずです。

django-todo-tutorial9

djangotodoはプロジェクトフォルダです。ここに、色々な設定を記入していきます。manage.pyはDjangoで色々な操作をおこなうためのファイルです。具体的にどんな操作ができるのか、さっそく見ていきましょう。

サーバーを立ち上げてロケットを飛ばす

先ほど作成したmanage.pyを使って、Djangoでロケットを飛ばしてみたいと思います。

以下のコマンドをターミナルに入力してみましょう。

$ python manage.py runserver

 

コマンドを実行すると、色々と表示されるはずです。

django-todo-tutorial10

赤文字の警告は後で解消できるので、今は気にしなくて大丈夫です。それよりも、http://localhost:8000 にアクセスしてみてください。

サーバーが立ち上がり、ロケットが発射されているはずです。

django-todo-tutorial11

これで、Djangoを使ったサーバーの立ち上げまで、できるようになりました。

最終的にはプログラムを書いていくことで、ロケットの代わりにTodoアプリが表示されます。

アプリを作成する

さて。ここまでプロジェクトの作成と、サーバーの立ち上げまで完了しました。

次にやるべきことは、Djangoでアプリを作成することです。もしサーバーを立ち上げたままだったらctrl + cで停止してから以下のコマンドをターミナルに入力しましょう。これでtodoという名前のアプリを作成できます。

$ python manage.py startapp todo

 

プロジェクトの作成と同様に、ターミナル上の変化は何もありません。代わりに新しくtodoというフォルダが作成できています。

django-todo-tutorial12

これでアプリを作成できました。ここでいうアプリというのは、”機能”みたいなイメージです。以下にDjango公式で書かれている説明を載せておきます。

プロジェクトとアプリケーション

プロジェクトとアプリの違いは何でしょうか? アプリとは、ウェブログシステム、公的記録のデータベース、小規模な投票アプリなど、何かを行う Web アプリケーションです。プロジェクトは、特定のウェブサイトの構成とアプリのコレクションです。プロジェクトには複数のアプリを含めることができます。 アプリは複数のプロジェクトに存在できます。

今回はタスクを投稿する機能しか作成しないので、todoという名前のアプリだけ作成します。

初期設定をおこなう

最後に、Todoアプリを開発するための初期設定をおこないましょう。具体的には、以下の設定をおこなっていきます。

  • 使用する言語とタイムゾーンの変更
  • アプリの登録

先ほどサーバーを立ち上げたとき、英語表記になっていましたよね。これはDjangoで英語がデフォルトの言語だからです。まずはこれを日本語にしましょう。

Djangoの設定はdjangotodo/settings.pyというPythonファイルに書かれています。

下にスクロールすると、106行目〜108行目にLANGUAGE_CODETIME_ZONEが見つかるはずです。

django-todo-tutorial13

これを以下のように書き換えましょう。

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

 

これで使用する言語は日本語、タイムゾーンは東京に変更できました。

あとは自分で作成したアプリを登録していきます。まずは33行目で書かれているINSTALLED_APPSを探しましょう。

django-todo-tutorial14

見つかったら以下のようにINSTALLED_APPSへ作成したアプリを追加します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'todo.apps.TodoConfig' # 自分で作成したアプリを追加
]

 

これで初期設定は完了です。試しにpython manage.py runserverでサーバーを立ち上げて、日本語になっているか確認してみましょう。

django-todo-tutorial15

しっかり日本語に切り替わっていますね。

STEP3 : モデルの作成とマイグレーションをおこなう

Todoアプリを作るためには、タスクを保存しておくデータベースが必要になります。DjangoではModelを定義することによって、SQLを書かずともデータベースで使うテーブルを作成することができます。

Modelを使ってテーブルを作成するために、STEP3では以下のトピックを紹介していきます。

  • models.pyでモデルを定義する
  • マイグレーションファイルを作成する
  • DBにテーブルを定義する

それでは順番に見ていきましょう。

models.pyでモデルを定義する

python manage.py startapp todoで色々なファイルが作成されました。このうち、Modelを記入するのは、todo/models.pyです。

今回タスクの登録には、まずタイトルを付けます。さらに、タイトルだけだと分かりづらい部分もあるので、別ページに移動したら詳細を見れるようにしたいです。

あとタスクには締め切りを設けたいですね。そのためにはtodo/models.pyの中で、以下のようなModelを定義してあげます。

from django.db import models


class Todo(models.Model):
    title = models.CharField("タスク名", max_length=50)
    description = models.TextField("詳細", blank=True)
    due = models.DateField("締切")

 

それぞれのモデルフィールドの意味は以下のとおりです。

  • CharField : MySQLでいうVARCHAR。テキストを入力するためのフィールド。
  • TextField : MySQLでいうLONGTEXT。テキストを入力するためのフィールド。
  • DateField : MySQLでいうDATE。日付を入力するためのフィールド。

もっと詳しくモデルフィールドを知りたいなら、公式ドキュメントを確認しましょう。

参考 : モデルフィールドリファレンス | Django ドキュメント | Django

マイグレーションファイルを作成する

とりあえずModelの定義は完了したけど、現状はPythonファイルにクラスを書いただけです。

ここからデータベースで使うテーブルにするために、次はマイグレーションファイルを作成します。

$ python manage.py makemigrations

 

コマンドの実行結果を見てみるとtodo/migrations/0001_initial.pyと書かれていまね。

django-todo-tutorial16

このファイルを開いてみましょう。そうすると、以下のような記載があるはずです。

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Todo',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=50, verbose_name='タスク名')),
                ('description', models.TextField(blank=True, verbose_name='詳細')),
                ('due', models.DateField(verbose_name='締切')),
            ],
        ),
    ]

 

この中でfieldsを見てみると、先ほどtodo/models.pyで定義した内容が、migrations.CreateModelの引数fieldsで渡されていることが分かります。

あと自動的にidも振られていますね。これでマイグレーションファイルの作成は完了です。

DBにテーブルを作成する

それでは最後に、マイグレーションファイルをもとに、データベースにテーブルを作成していきましょう。そのためには、以下のコマンドをターミナルに入力します。

$ python manage.py migrate

 

このコマンドを実行すると、いくつかOKが表示されるはずです。

問題なくコードが通っていれば、これでデータベースにテーブルを追加できています。SQLを書かずにテーブルを作成できるなんて便利ですよね!

あとは本当にテーブルを作成できてるか気になりますよね。

次のSTEP4ではテーブルを確認する方法と、作成したテーブルにTodoタスクを登録してみたいと思います。

STEP4 : 管理画面の設定とTodoタスクの登録

SQLを使えばテーブルの確認とTodoタスクの登録ができます。

でもここでは、Djangoで最初から用意されている管理画面を使って、テーブルの確認とタスクの登録をやっていきます。

そのためにSTEP4では、以下のトピックを紹介します。

  • SuperUserを作成する
  • 管理画面にログインする
  • Todoテーブルを管理画面で確認できるようにする
  • Todoタスクを登録する
  • データの表記方法を変える

それでは順番に見ていきましょう。

SuperUserを作成する

「管理画面」というくらいなので、そもそもアプリを管理人が必要ですよね。そんなとき、普通だったらデータベースを操作して、管理者権限を持つユーザーを作成します。

でもDjangoでは、以下のコマンドを叩くだけで、管理者権限を持ったユーザーを作成できます。

$ python manage.py createsuperuser

 

コマンドを実行したら、以下の情報を順番に入力していきましょう。

  • ユーザー名 : なんでも良いです。今回はadminにします。
  • メールアドレス : 何も入力せずにEnterキーを押して大丈夫です。
  • Password : 自分で決めたパスワードを入力しましょう。
  • Password(admin) : 自分で決めたパスワードをもう一度入力しましょう。

このとき、パスワードが単純すぎると、以下のように警告が出てきます。

django-todo-tutorial17

今回は練習なので、”y”を入力して次に進みます。これで管理者権限を持ったユーザーを作成できました。

管理画面にログインする

それではDjangoの管理画面にログインしてみます。まずはサーバーを起動しましょう。

$ python manage.py runserver

 

そういえばpython manage.py migrateを実行したので、警告がなくなっていますね。

django-todo-tutorial18

サーバーの起動後は、http://localhost:8000/admin にアクセスしましょう。そうすると管理画面にログインできるページに遷移します。

django-todo-tutorial19

ここで先ほど作成したSuperUserの「ユーザー名」と「パスワード」を入力しましょう。ログインに完了すると、以下のようなページに遷移するはずです。

django-todo-tutorial20

このページでは、データベースに作成したテーブルを確認できます。でもTodoテーブルが表示されていませんね…。

Todoテーブルを管理画面で確認できるようにする

作成したテーブルを管理画面で確認するには、todo/admin.pyで使用するモデルを登録する必要があります。

具体的には以下のコードを追加することで、管理画面でTodoテーブルを使えるようになります。

from django.contrib import admin
from todo.models import Todo


admin.site.register(Todo)

 

コードを追加できたら、また管理画面にアクセスしてみましょう。すると今度は、Todoテーブルが表示されていますね。

django-todo-tutorial21

中身を開いてみるとこんな感じ。

django-todo-tutorial22

まだタスクを登録していないので、何も表示されていません。

Todoタスクを登録する

 

 

データの表記方法を変更する

 

from django.db import models


class Todo(models.Model):
    title = models.CharField("タスク名", max_length=50)
    description = models.TextField("詳細", blank=True)
    due = models.DateField("締切")

    def __str__(self):
        return self.title

 

 

STEP5 : ルーティングを理解する

 

djangotodo/urls.py

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path("", include("todo.urls")),
    path("admin/", admin.site.urls),
]

 

 

 

 

STEP5 : 登録されたTodoタスクを表示する | Read

 

urls.py | ルーティングの設定

 

from django.urls import path

from todo.views import TodoListView


urlpatterns = [
    path("", TodoListView.as_view(), name="index"),
]

 

views.py | Viewの作成

 

from django.shortcuts import render
from django.views.generic import ListView

from todo.models import Todo


class TodoListView(ListView):
    template_name = "todo/index.html"
    model = Todo
    context_object_name = "posts"

 

index.html | templateの作成

 

todo/templates/todo/index.html

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>DjangoTodo</title>
</head>
<body>
    <h1>Todoタスク一覧</h1>
</body>
</html>

 

 

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>DjangoTodo</title>
</head>
<body>
    <h1>Todoタスク一覧</h1>
    {% if posts %}
    <table>
        <thead>
            <th>タイトル</th>
            <th>締切</th>
        </thead>
        <tbody>
            {% for post in posts %}
            <tr>
                <td>{{ post.title }}</td>
                <td>{{ post.due }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
    {% else %}
    <p>Todoタスクはありません。</p>
    {% endif %}
</body>
</html>

 

 

STEP6 : Todoタスクの詳細を表示する | Read

 

 

urls.py | ルーティングの設定

 

from django.urls import path

from todo.views import TodoListView, TodoDetailView


urlpatterns = [
    path("", TodoListView.as_view(), name="index"),
    path("detail/<int:pk>", TodoDetailView.as_view(), name="detail"),
]

 

 

views.py | Viewの作成

 

class TodoDetailView(DetailView):
    template_name = "todo/detail.html"
    model = Todo
    context_object_name = "post"

 

detail.html | templateの作成

 

 

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>DjangoTodo</title>
</head>
<body>
    <h1>Todoタスクの詳細</h1>
    <h2>タイトル:{{ post.title }}</h2>
    <p>期限:{{ post.due }}</p>
    <p>詳細:{{ post.description }}</p>
</body>
</html>

 

 

STEP7 : Todoタスクを作成できるようにする | Create

 

urls.py | ルーティングの設定

 

from django.urls import path

from todo.views import TodoListView, TodoDetailView, TodoCreateView


urlpatterns = [
    path("", TodoListView.as_view(), name="index"),
    path("detail/<int:pk>", TodoDetailView.as_view(), name="detail"),
    path("create/", TodoCreateView.as_view(), name="create"),
]

 

 

views.py | Viewの作成

 

from django.urls import reverse_lazy

class TodoCreateView(CreateView):
    template_name = "todo/create.html"
    model = Todo
    fields = ("title", "description", "due")
    success_url = reverse_lazy("index")

 

create.html | templateの作成

 

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>DjangoTodo</title>
</head>
<body>
    <h1>Todoタスクの作成</h1>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">作成</button>
    </form>
</body>
</html>

 

 

STEP8 : Todoタスクを編集できるようにする| Update

 

urls.py | ルーティングの設定

 

from django.urls import path

from todo.views import (
    TodoListView,
    TodoDetailView,
    TodoCreateView,
    TodoUpdateView,
)


urlpatterns = [
    path("", TodoListView.as_view(), name="index"),
    path("detail/<int:pk>", TodoDetailView.as_view(), name="detail"),
    path("create/", TodoCreateView.as_view(), name="create"),
    path("update/<int:pk>", TodoUpdateView.as_view(), name="update"),
]

 

views.py | Viewの作成

 

class TodoUpdateView(UpdateView):
    template_name = "todo/update.html"
    model = Todo
    fields = ("title", "description", "due")
    success_url = reverse_lazy("index")

 

 

update.html | templateの作成

 

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>DjangoTodo</title>
</head>
<body>
    <h1>Todoタスクの編集</h1>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">保存</button>
    </form>
</body>
</html>

 

 

STEP9 : Todoタスクを削除できるようにする | Delete

 

urls.py | ルーティングの設定

 

from django.urls import path

from todo.views import (
    TodoDeleteView,
    TodoListView,
    TodoDetailView,
    TodoCreateView,
    TodoUpdateView,
)


urlpatterns = [
    path("", TodoListView.as_view(), name="index"),
    path("detail/<int:pk>", TodoDetailView.as_view(), name="detail"),
    path("create/", TodoCreateView.as_view(), name="create"),
    path("update/<int:pk>", TodoUpdateView.as_view(), name="update"),
    path("delete/<int:pk>", TodoDeleteView.as_view(), name="delete"),
]

 

views.py | Viewの作成

 

class TodoDeleteView(DeleteView):
    template_name = "todo/delete.html"
    model = Todo
    success_url = reverse_lazy("index")

 

delete.html | templateの作成

 

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>DjangoTodo</title>
</head>
<body>
    <h1>Todoタスクの削除</h1>
    <p>本当に削除しますか?</p>
    <form method="POST">
        {% csrf_token %}
        <button type="submit">削除</button>
    </form>
</body>
</html>

 

STEP10 : トップページからCRUD機能を使えるようにする

 

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>DjangoTodo</title>
</head>
<body>
    <h1>Todoタスク一覧</h1>
    <a href="{% url 'create' %}">タスクを作成する</a>
    {% if posts %}
    <table>
        <thead>
            <th>タイトル</th>
            <th>締切</th>
        </thead>
        <tbody>
            {% for post in posts %}
            <tr>
                <td><a href="{% url 'detail' post.pk %}">{{ post.title }}</a></td>
                <td>{{ post.due }}</td>
                <td><a href="{% url 'update' post.pk %}">編集</a>/<a href="{% url 'delete' post.pk %}">削除</a></td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
    {% else %}
    <p>Todoタスクはありません。</p>
    {% endif %}
</body>
</html>

 

 

STEP11 : 共通テンプレートを作成して見た目を整える

 

 

STEP12 : 作成したDjangoアプリをデプロイする

 

 

ABOUT ME
はやたす
たくさんPythonを紹介するYouTuberです(登録者1.94万人) | フリーランスで機械学習/分析案件も請けています(経験業界 : 金融, 情報通信, サービス) | 元プログラミングスクール講師