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オブジェクトを返してくれるため、こちらの方が効率よく処理の分岐を書くことができる。

存在しないIDへのアクセスがあった場合404が返される