Django入門: オブジェクトの取得 ~ 簡単な一行掲示板アプリを作る その9【Windows10】

86, 2020-10-22

目次

はじめに

この記事は「Djangoで一行掲示板を作ろう」という趣旨のシリーズの記事です。

前回までにDjangoのプロジェクトとアプリを作成し、ルート情報とビューを接続し、テンプレートを描画して、モデルを作りマイグレーションを行いました。

今回から作成したモデルを使ってビューとテンプレートに処理を加えていきます。

また前提としてOSはWindows10, シェルはコマンドプロンプトを使います。
Pythonの仮想環境を使っていますのでvenv\Scripts\activateを実行してある前提です。
仮想環境についてはこちらの第一回の記事をご覧ください。

それから初期位置の作業ディレクトリはプロジェクト内のmanage.pyがあるディレクトリです。

掲示板の仕様

いまさら掲示板の仕様の話ですが、これはシンプルなものにします。
まず、掲示板の利用者の投稿をリストで一行ずつ表示します。
その下に投稿フォームを作り、利用者が投稿できるようにします。
ページャーなどは実装せずに、基本的に投稿内容を垂れ流すだけの掲示板です。

この画面はホーム画面、つまりhome_viewhome.htmlに実装します。

ビューの改造

前回はPostモデルを作成しました。
これまでに作成した「Hello, World!」用の実装を取り払って、このPostモデルを使った処理を書いていきたいと思います。
まず画面にPostのリストが表示されるように改造します。
このためにはhome_viewbbs\home.htmlをいじります。

まずhome_viewを改造します。
manage.pyのあるディレクトリからbbs\views.pyを開くと↓のような内容になっていると思います。

from django.shortcuts import render


def home_view(request):
    """
    パス bbs/ のテンプレートを出力するビュー
    """
    context = {}  # コンテキストを作成
    context['message'] = 'Hello, World!'  # コンテキストにmessage変数を作成

    # renderにコンテキストを渡しテンプレートを描画
    return render(request, 'bbs/home.html', context)

このビューを↓のように改造します。

from django.shortcuts import render
from bbs.models import Post  # modelsからPostモデルをインポート


def home_view(request):
    """
    パス bbs/ のテンプレートを出力するビュー
    """
    context = {}  # コンテキストを作成

    context['title'] = '一行掲示板'  # ページのタイトル
    context['posts'] = Post.objects.all()  # Postのリストを取得

    # renderにコンテキストを渡しテンプレートを描画
    return render(request, 'bbs/home.html', context)

まず↓の部分です。

from bbs.models import Post  # modelsからPostモデルをインポート

bbsアプリが持つmodels.pyからモデルPostをインポートしています。

    context['title'] = '一行掲示板'  # ページのタイトル

↑は掲示板のタイトルを文字列として定義している所です。
次に目新しいところで↓の部分ですが、

    context['posts'] = Post.objects.all()  # Postのリストを取得

models.Modelを継承したPostモデルは、objectsという属性を持っています。
このobjects以下にはモデルを取得したり作成したりするメソッドが定義されています。
厳密にはこのobjects以下のメソッドはDBへのクエリーを生成するためのものです。
allというメソッドはPostのテーブルからすべてのレコードを取得し、そのレコードをDjangoのオブジェクトに変換する手段を提供するメソッドで、返り値はdjango.db.models.query.QuerySetです。
こうすることで掲示板の利用者の投稿をすべて取得し、コンテキストのposts変数に代入しています。

QuerySetはリストやタプルに自由に変換できるオブジェクトです。
QuerySetはその変換時に内蔵しているデータをオブジェクト、つまりPostモデルなどのインスタンスに変換します。

掲示板の利用者の投稿を全て取得すると言っても、今のところ掲示板の利用者はおらず、Postのレコードは0件です。
そのためコンテキスト内のposts変数は空になります。
しかしわざわざ投稿フォームを作るまで、↑のビューを検証できないというのも面倒な話です。
そういう時に便利なのがDjangoの管理サイトですが、これについては次回以降に説明したいと思います。

コードの検証

今回修正を加えたコードの検証を行います。
↓のコマンドを実行してください。

> python manage.py check

特に問題が無ければ↓のように表示されると思います。

System check identified no issues (0 silenced).

おわりに

今回はPostモデルを使ってビューを改造しました。
次回からテンプレートの改造に入りたいと思います。
また、その次ぐらいに管理サイトの使い方の解説も予定しています。

また来週