syakoo's Lab

技術ブログやちょっと気合の入った記事を残すブログ

数学を勉強するWebサイトの開発日記(5: データベース`models.py`)

はじめに

そこまで大きな事をするつもりはないです。ただの個人開発の勉強を含めたサービス作りの過程を残すブログです。

データベースをいじる

久しぶりに時間ができたので、今回はmodels.pyを使ってデータベースをいじってみる。この流れで進めていく。

  1. データベースをモデルとして持ってくる(models.py)
  2. Djangoadminでデータベースをいじる(admin.py)
  3. htmlにデータベースの中身を出力する(views.pytamplates/..)

Djangoのおかげでめっちゃ簡単なのでパパっと行っちゃいましょう。

1. データベースをモデルとして持ってくる(models.py)

さて、もちろんサーバーでユーザの情報や記事の情報を制御するわけですが、サーバサイドではPythonで動かしているからデータベースも簡単にPythonで制御したい...!!ってことで使うのがmodels.py。データベースの情報をオブジェクトとして制御することが可能になる!! どのモデルを用意するかというと、定義を集めたDefinitionと定理を集めたTheoremを作成していく。models.pyはこんな感じになった。

models.py

from django.db import models


class Definitions(models.Model):
    title = models.CharField('定義名', max_length=255)
    file_name = models.CharField('ファイル名', max_length=63)
    created_at = models.DateTimeField('作成日', auto_now_add=True)

    def __str__(self):
        return self.title


class Theorems(models.Model):
    title = models.CharField('定理名', max_length=255)
    file_name = models.CharField('ファイル名', max_length=63)
    created_at = models.DateTimeField('作成日', auto_now_add=True)

    def __str__(self):
        return self.title

とりあえず今のところはそれぞれに定義名 ファイル名 作成日の3つの情報を入れた。これでデータベースをオブジェクトとして管理することができるようになる。

2. Djangoadminでデータベースをいじる(admin.py)

次に、スーパーユーザでデータベースの中身を制御できるように設定していく。

admin.py

from django.contrib import admin
from .models import Definitions, Theorems


admin.site.register(Definitions)
admin.site.register(Theorems)

先ほど作ったDefinitionsTheoremsのオブジェクトを参照している。

動作確認をする。まずは、models.pyで作成したオブジェクトをデータベースと対応付ける必要がある。詳細は省くが以下のコマンドを打つ。

$ python manage.py makemigrations
$ python manage.py migrate

これでlocalhost:8000/adminにアクセスして確認してみると

f:id:syakoo:20190722212645p:plain

先ほど作ったDefinitionsTheoremsのオブジェクトがデータベースにあることが確認できた。

3. htmlにデータベースの中身を出力する(views.pytamplates/..)

さいごにクライアント側にデータを出力する処理を確認する。views.pymodels.pyで作成したモデルにアクセスしtemplates/..で表示するとうまくいきそう。今回はlocalhost:8000/homeに出力してみる

views.py

from django.shortcuts import render

from .models import Definitions, Theorems


def home(request):
    definitions = Definitions.objects.all()
    theorems = Theorems.objects.all()
    context = {
        'definitions': definitions,
        'theorems': theorems,
    }
    return render(request, "webapp/home.html", context)

templates/webapp/home.html

<h1> Home Page </h1>
<div>
    <h2 class="text-success">Definition</h2>
    <table class="table table-success">
        <thead>
            <th>定義名</th>
            <th>ファイル名</th>
            <th>作成日</th>
        </thead>
        {% for def in definitions %}
            <tr>
                <th>{{ def.title }}</th>
                <td>{{ def.file_name }}</td>
                <td>{{ def.created_at }}</td>
            </tr>
        {% endfor %}
    </table>
</div>

今回はDefinitionsのみを出力してみる。

動作結果の前に...

出力しようとしているが、もちろん今データベースは空なので、adminからデータベースに参照して要素を追加する。 f:id:syakoo:20190722212754p:plain

動作結果

localhost:8000/homeに行くと...

f:id:syakoo:20190722212818p:plain 先ほど追加した内容が出力されている。

さいごに

adminの画面にDefinitionssとsが重複しているので修正する必要がある。 今はまだ大丈夫だけど、記事の編集画面を作る作業が果てしなく時間がかかりそうでやりたくない。