茨城エンジニアのPython開発日記

茨城のITベンチャー企業ではたらく2年目エンジニア。Pythonで色々なものを作成中。

djangoでデータベースの内容を表示してみた


ブログから記事を見つけたい場合はこちら

ブログ地図 - 茨城エンジニアのPython開発日記

こんにちは松原です。
所要で北群馬に行きたいのですが、そろそろ雪が降り始めそう。
積もったら詰むので12月中旬まで降らないでほしい。


今日はdjangoでデータベースの中身を表示してみます。

前回はデータベースにadminサイトからアクセスしましたが、
一般ユーザーがみるサイト上でデータベースの中身を表示するということですね。

0. 概要

流れはこんな感じ

1 urls.pyにビューを登録
2 ビューを作成
・継承元を指定
・htmlを指定
・モデル(取り扱うデータベース)を指定
3 htmlを作成
・base_dirを指定
・base.htmlを作成
・html本体を作成

ビューというのが色々組み合わせて最終的にレスポンスを返してくれる大元っぽいです。
で、具体的には以下を指定して組み合わせます。

「継承元(djangoの方で用途に応じたビューを用意してくれているので、適切なビューを選んで継承する)」
「取り扱うデータベース」
「自分で作ったhtml」

継承元のビューを色々と用意してくれているのがdjangoのいいとこなのかな。

1. urls.pyにビューを登録

まず最初に、「このurlを指定されたときにこのビューを返す」という風にURLと対応付けます。
appの方のurls.pyでこう。

from django.contrib import admin
from django.urls import path, include
from .views import tempfunc
from .views import KizaiList

urlpatterns = [
    path('temp/', tempfunc),
    path('kizai_list/', KizaiList.as_view()),
]

2. ビューを作成

次に先ほど登録したKizaiListビューを作成します。
appの方のviews.pyでこう。

from django.shortcuts import render
from django.http import HttpResponse
from .models import KizaiStatus

# Create your views here.
def tempfunc(request):
    return HttpResponse("temp")

class KizaiList(ListView):
    model = KizaiStatus
    template_name = "kizai_list.html"

これでデータベースとして前回作成, データ入力したKizaiStatusを指定、利用するhtmlとしてkizai_list.htmlを指定したことになります。
で、このクラスはListViewというViewを参照しており、これはデータベース一覧を表示するのに適したビューとのこと。

親クラスのメンバとしてmodelとtemplate_nameがあって、それに入力することで色々組み合わせてくれてる様子。

3. htmlを作成

kizai_list.htmlを作成します。
まず最初に、ここにhtmlファイルたちを置くよということをdjangoのプロジェクトに教えてあげます。
プロジェクトのsetting.pyの一部をこう。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, "html_templates"],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

これで、manage.pyと同階層のhtml_templatesフォルダにhtmlたちが入ってることをdjangoに教えてあげました。
このフォルダはmanage.pyと同じ階層に自分で作ります。

この情報と2で記入したhtmlファイル名を合わせて、ビューはhtmlの場所を完全に把握することができます。

次はhtmlを実際に作ります。共用のパーツはbase.htmlに書いてしまいます。
コメントで書いてあるのが説明

<!DOCTYPE html>

<html lang=en>
    <!--使いまわす部分は全部base.htmlに書いておく-->
    <head>

    </head>
    <body>
        <h1>機材管理</h1>

        <!--ページごとに違う部分だけprintfの変数のようなイメージでおいておく-->
        {% block content %}
        {% endblock content %}
    </body>
</html>

で、kizai_list.htmlをこのように作成。

{% extends "base.html" %}

{% block content %}

{% for status in object_list %}

<div>
{{ status.kizai_name }}
{{ status.using_person_name }}
{{ status.user_memo }}
</div>
{% endfor %}

{% endblock content %}

ListViewを継承しているのでobject_list という変数をもともと持っており、この中にデータベース情報がリストとして入っています。
なのでListViewを継承しているとデータベースの一覧表示に向いているんですね。

で、djangoの記法でfor文回してそれをprintしてるイメージ。
djangoの記法の一般的なのどこで覚えればいいんだ……

4. できたものとこれから

こんな感じにできました。
f:id:tottorisnow33:20211123173819p:plain

ここから進化させていくには、viewをたくさん覚えて使いこなしていく感じかなあと思います。
データベースに登録するビューやら更新するビュー、アカウントにサインインするビューなど色々あるようです。

で、これらをうまいこと組み合わせてデータベースに対してアクセスのよいサイトを作成。

また見た目をcss等で整える必要があるのは普通のサイトと同じですね。
一番苦手な作業。

ではまた次回。