【Django入門】 簡単なメモアプリを作る。最低限の機能しかありません

最近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

http://127.0.0.1:8000/

にアクセスするとトップページが開きます。

おまけ

管理ユーザーを作成して、そこから操作してみます。

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.

http://127.0.0.1:8000/admin

admin上でMemoアプリを編集出来るようにします。
memos/admin.py

# memos/admin.py
from django.contrib import admin

from .models import Memo

admin.site.register(Memo) # new

参考文献

https://docs.djangoproject.com/ja/3.0/intro/tutorial02/
タイトルとURLをコピーしました