最近Djangoを始めたので、勉強がてら超シンプルなメモアプリを作ってみました。
基本的には公式のtutorialを参考にしています。
しかし、tutorialよりもさらに簡素なものです(笑)。
以下のようなトップページを持つアプリです。
バージョン等
- Python 3.6.0
- Django 2.2
Djangoのインストール
pip install django
実装
これから少しずつ実装していきますが、
全ソースコードはgithubにも上がっています。
https://github.com/tocom242242/simple_memo_for_studying_django
では少しずつ作っていきます。
まずプロジェクトを作成して、そのディレクトリに移動します。
今回は雑にプロジェクト名をsample_projectとします。
django-admin startproject project cd sample_project
Djangoでは、各機能をアプリ単位で扱います。
今回はメモ機能があるのでmemosというアプリを作成します。
アプリは以下のコマンドで作成できます。
python manage.py startapp memos
次にMemoモデルを作成します。
モデルはmemos/models.pyに記述します。
# memos/models.py from django.db import models class Memo(models.Model): text = models.CharField(max_length=200) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.text
textフィールドがメモのテキストを保存するフィールドです。
created_atはデータを生成した時間です。
次に追加したアプリをプロジェクトに反映します。
これはsample_project/settings.pyに記述します。
# sample_project/settings.py 省略 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'memos.apps.MemosConfig', #new ] 省略
次に作成したモデルをDBに反映します。
以下のコマンドを叩くことで、sql文を書かなくてもDBにテーブルを作成してくれます。
python manage.py makemigrations memos python manage.py migrate
では、モデルを作って遊んでみます。まずは以下のコマンドでPythonの対話シェルを開きます。
python manage.py shell
通常のPythonの対話シェルではなく、このコマンドを使用することによってsample_project/settings.pyの設定を反映してくれるようです。
先程作ったモデルを使って遊んでみます。
from memos.models import Memo # すべてのメモを取り出す Memo.objects.all() # 新規のメモを作成 m = Memo(memo_text="test_memo") # メモの保存 m.save() m.id #=> 1 m.created_at #=> datetime.datetime(2020, 1, 22, 3, 52, 53, 752214, tzinfo=) # もう一度すべてのメモを取り出す Memo.objects.all()
次にviewsを書いていきます。
# memos/views.py from django.shortcuts import get_object_or_404, render, redirect from django.urls import reverse from .models import Memo def index(request): memo_list = Memo.objects.all() context = {'memo_list': memo_list} return render(request, 'memos/index.html', context) def detail(request, memo_id): memo = get_object_or_404(Memo, pk=memo_id) return render(request, 'memos/detail.html', {'memo': memo}) def insert(request): memo = Memo.objects.create(text=request.POST["memo"]) memo.save() index_url = reverse("index") return redirect(index_url)
簡単に説明すると、indexメソッドがトップページのviewについて記述しています。
ここでは、ただすべてメモを取り出してトップページのレンダリングを行います。
detailメソッドではメモの詳細のviewについて記述しています。
insertメソッドでは新しいメモを作成する処理について記述しています。
ポストされたテキストを受け取り、そのテキストのMemoオブジェクトを作り保存します。
次にリンクの設定を行います。
# memos/urls.py from django.urls import path from . import views urlpatterns = [ # /memos/ path("", views.index, name="index"), # /memos/ path("insert", views.insert, name="insert_memo"), # /memos/1/ path("/", views.detail, name="detail") ]
app自体のurlの設定を行います。
# app/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path("", include("memos.urls")), # new path('admin/', admin.site.urls), ]
トップページ、詳細ページを追加します。
追加するのはmemos/templates/memos/の下に書いていきます。
ディレクトリがなければ作ってください。
まず、memos/templates/memos/index.htmlを書いていきます。
<h2>メモの作成</h2> <form method="POST" action="insert"> {% csrf_token %} <input type="text" name="memo" /> <input type="submit" value="送信" /> </form> <h2>メモ一覧</h2> {% if memo_list %} <ul> {% for memo in memo_list %} <li><a href="/{{ memo.id }}/">{{ memo.id }}:{{ memo.text }}</a></li> {% endfor %} </ul> {% else %} <p>No memos are available.</p> {% endif %}
次にdetail.htmlのページです。
memos/templates/memos/detail.html
{{ memo }}
ここまで実装できたら、以下のコマンドでサーバーを起動します。
python manage.py runserver
にアクセスするとトップページが開きます。
おまけ
管理ユーザーを作成して、そこから操作してみます。
python manage.py createsuperuser Username (leave blank to use 'okano'): admin Email address: admin_pass Error: Enter a valid email address. Email address: test@gmail.com Password: Password (again): Superuser created successfully.
admin上でMemoアプリを編集出来るようにします。
memos/admin.py
# memos/admin.py from django.contrib import admin from .models import Memo admin.site.register(Memo) # new