Django入門: オブジェクトの取得 ~ 簡単な一行掲示板アプリを作る その9【Windows10】
- 作成日: 2020-10-22
- 更新日: 2023-12-26
- カテゴリ: Django
はじめに
この記事は「Djangoで一行掲示板を作ろう」という趣旨のシリーズの記事です。
前回までにDjangoのプロジェクトとアプリを作成し、ルート情報とビューを接続し、テンプレートを描画して、モデルを作りマイグレーションを行いました。
今回から作成したモデルを使ってビューとテンプレートに処理を加えていきます。
また前提としてOSはWindows10, シェルはコマンドプロンプトを使います。
Pythonの仮想環境を使っていますのでvenv\Scripts\activate
を実行してある前提です。
仮想環境についてはこちらの第一回の記事をご覧ください。
それから初期位置の作業ディレクトリはプロジェクト内のmanage.py
があるディレクトリです。
掲示板の仕様
いまさら掲示板の仕様の話ですが、これはシンプルなものにします。
まず、掲示板の利用者の投稿をリストで一行ずつ表示します。
その下に投稿フォームを作り、利用者が投稿できるようにします。
ページャーなどは実装せずに、基本的に投稿内容を垂れ流すだけの掲示板です。
この画面はホーム画面、つまりhome_view
とhome.html
に実装します。
ビューの改造
前回はPost
モデルを作成しました。
これまでに作成した「Hello, World!」用の実装を取り払って、このPost
モデルを使った処理を書いていきたいと思います。
まず画面にPost
のリストが表示されるように改造します。
このためにはhome_view
とbbs\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
モデルを使ってビューを改造しました。
次回からテンプレートの改造に入りたいと思います。
また、その次ぐらいに管理サイトの使い方の解説も予定しています。
🦝 < また来週