(最終更新月:2021年11月)
「モデルクラス名.objects.get(pk=pk)の何が悪いの?」
「Webアプリの公開に向けてより実践的な機能を実装したい!」
というDjango初学者の方へ向けての記事となります
当記事を通じて、
- 404ページを表示するための「get_object_or_404」メソッドの使い方
を解説していきます
そもそも
「この記事で説明している404ページって必要あるの?」
「何のために必要なの??」
という方も多いかと思います
まずは現状での問題点からわかりやすく解説していきますので、順にお進みください
当記事はアプリ開発~公開までをご紹介しているシリーズの一記事になります
最終的には、下記リンク先のような日報アプリを開発、公開できるように進めていきます
興味のある方は下記よりシリーズをまとめたページへお進みください

今のままだとダメなの?
現況だと、ディーテイルビューやアップデートビューでは、URLで「pk」を受け取り、対象のデータをデータベースから取得するよう記述しています
変数名 = NippoModel.objects.get(pk=pk)
仮に「pk」が存在しない値でアクセスを試みると、
※「pk」を100としアクセスを試みます(データとして存在しない値であれば何でも良いです!)

対象の「query」が存在しないというエラーになります
ターミナルでは、
"GET /nippo/update/100/ HTTP/1.1" 500 73186
となっています
これは、URLの入力というリクエストに対して、サーバー側からのレスポンスのステータスが「500」ということを意味しています
ステータス「500」というのは、サーバーに関する様々なエラーを指しているため、Webで公開後環境で起こるとエラーの原因が特定できないためとても不便です
つまり、開発中のローカル環境で出てくる分には気になりませんが、公開後を考えると修正する必要があるということになります
それでは通常、存在しないページへアクセスするとどんなページ、レスポンスが返ってくるのでしょうか?
当ブログで存在しないURLを打ち込んでみましょう

というページが返ってきます
これは、ステータス404という「ページが見つからない」時に出てくるステータスコードです
これだと「ページが見つからない!」ということがはっきりわかりますので、当アプリでもステータス404を返すように設定していくことが重要になります
【ステータス404を返す】get_object_or_404
get_object_or_404(クラス名, 引数)
ととすることで、
- 対象のオブジェクトを取得する
- 取得できない場合は404ページを返す
ということが可能になります
実際のコードを見ていきましょう!
【実例紹介】日報アプリに使ってみよう!
何はともあれまずはメソッドをインポートしましょう
from django.shortcuts import render, get_object_or_404
nippoDetailView関数、nippoUpdateForm関数内で下記の記述を変更していきましょう
オブジェクト変数 = NippoModel.objects.get(pk=pk)
を、
オブジェクト変数 = get_object_or_404(NippoModel, pk=pk)
へ変更していきます
【ディテールビュー】nippoDetailView
def nippoDetailView(request, pk):
template_name = "nippo/nippo-detail.html"
ctx = {}
q = NippoModel.objects.get(pk=pk)
ctx["object"] = q
return render(request, template_name, ctx)
【アップデートビュー】nippoUpdateFormView
def nippoUpdateFormView(request, pk):
template_name = "nippo/nippo-formclass.html"
obj = NippoModel.objects.get(pk=pk)
initial_values = {"title": obj.title, "content":obj.content}
form = NippoFormClass(request.POST or initial_values)
ctx = {"form": form}
ctx["object"] = obj
if form.is_valid():
title = form.cleaned_data["title"]
content = form.cleaned_data["content"]
# obj = NippoModel(title=title, content=content)
# obj.save()
obj.title = title
obj.content = content
obj.save()
return render(request, template_name, ctx)
【ブラウザからアクセスしてみると、】

先程のページとは違い、「Page not found」のステータスコード404が表示されているのがわかります
まとめ
ローカル環境ではDjangoの設定「DEBUG=True」となっているため、どんなエラーでもわかりやすいメッセージが出てくるようになっています
ただ、Webに公開するとそうもいきません
ステータスコードを正しく返すということでエラーの原因がはっきりとわかるようになります
404ページを返すために、
- get_object_or_404メソッドをインポート
- get_object_or_404(クラス名, 引数)
の流れを忘れずに頭へ入れておきましょう!
次回は、いよいよ「CRUD」の「D」、アクセスしたページからデータベースのデータを削除する方法を解説していきます
当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています
「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」
という方は必見です!
