【Django(初学者向け)】404ページって必要!?get_object_or_404の書き方を解説します!

Django

(最終更新月:2021年11月)

モデルクラス名.objects.get(pk=pk)の何が悪いの?」

「Webアプリの公開に向けてより実践的な機能を実装したい!」

というDjango初学者の方へ向けての記事となります

当記事を通じて、

  • 404ページを表示するための「get_object_or_404」メソッドの使い方

を解説していきます

そもそも

「この記事で説明している404ページって必要あるの?」

「何のために必要なの??」

という方も多いかと思います

まずは現状での問題点からわかりやすく解説していきますので、順にお進みください

今のままだとダメなの?

現況だと、ディーテイルビューやアップデートビューでは、URLで「pk」を受け取り、対象のデータをデータベースから取得するよう記述しています

変数名 = NippoModel.objects.get(pk=pk)

仮に「pk」が存在しない値でアクセスを試みると、

localhost:8000/nippo/update/100/

※「pk」を100としアクセスを試みます(データとして存在しない値であれば何でも良いです!)

対象の「query」が存在ないというエラーになります

ターミナルでは、

"GET /nippo/update/100/ HTTP/1.1" 500 73186

となっています

これは、URLの入力というリクエストに対して、サーバー側からのレスポンスのステータスが「500」ということを意味しています

ステータス「500」というのは、サーバーに関する様々なエラーを指しているためWebで公開後環境で起こるエラーの原因が特定できないためとても不便です

つまり、開発中のローカル環境で出てくる分には気になりませんが、公開後を考えると修正する必要があるということになります

それでは通常、存在しないページへアクセスするとどんなページ、レスポンスが返ってくるのでしょうか?

当ブログで存在しないURLを打ち込んでみましょう

itc.tokyo/something-wrong-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ページを返すために、

  1. get_object_or_404メソッドをインポート
  2. get_object_or_404(クラス名, 引数)

の流れを忘れずに頭へ入れておきましょう!

次回は、いよいよ「CRUD」の「D」、アクセスしたページからデータベースのデータを削除する方法を解説していきます

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

公式LINEも始めました。ブログの更新や最新の業界情報などを随時配信します!

友だち追加

タイトルとURLをコピーしました