Djangoのビューでは、基本的にHttpResponseオブジェクトか、404エラー、どちらかを返すよう作られる。
今回は意図しないURLパターンでのアクセスがあった場合に、404エラーを返す方法を紹介する。
前回までの記事はこちら。
【Django】テンプレートを使ったビューの構築
try文で404エラーを返す方法
まず、シンプルにtry文を使った方法を見ていこう。
今回は質問詳細ビューに対し、存在しない質問IDでアクセスがあった際に404エラーを返す処理を実装する。
polls/views.py内、detailクラスのコードを以下のとおり編集する。
# 追加
from django.http import Http404
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'polls/detail.html', {'question': question})
question_idを元にQuestionオブジェクトを取得するが、もし存在しなかった場合に例外としてHttp404オブジェクトを返すようにしている。
なお、detail.htmlはテンプレートディレクトリ内に配置する。
ひとまず確認用として、detail.htmlには以下のコードを書いておこう。
{{ question }}
以下のURLにアクセスし、質問ID:1に該当する質問が存在すれば質問文が表示され、IDが存在しない場合は404エラーが表示されるはずだ。
http://127.0.0.1:8000/polls/1/
get_object_or_404を使ったショートカット
上記で書いたコードは、ショートカットを使い以下のように書き換えることもできる。
from django.shortcuts import get_object_or_404, render
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
getメソッドはオブジェクトが存在しない場合に自動的にHttp404オブジェクトを返してくれるため、こちらの方が効率よく処理の分岐を書くことができる。