在Django开发中,我们经常会想通过类似于 raise Http404("Page not found.") 的代码来展示自定义404页面。
本文将实用地整理404错误的发生原因、模板连接方法,以及403/500错误的处理方式。

1. 触发404错误的常见方法
我们分类了Django中触发404错误的情况,可能有下面四种吧。
1. raise Http404("说明")
直接显式触发404错误的最基本方法。
from django.http import Http404
def my_view(request):
if not condition:
raise Http404("Page not found.")
2. get_object_or_404()
Django中常用的快捷函数。如果对象不存在,则自动触发404。
from django.shortcuts import get_object_or_404
post = get_object_or_404(Post, pk=pk)
3. 使用 Model.objects.get() 后进行异常处理
在这种情况下,也需要手动触发404。
from django.http import Http404
from django.core.exceptions import ObjectDoesNotExist
try:
post = Post.objects.get(pk=pk)
except ObjectDoesNotExist:
raise Http404("Post not found.")
4. 当URLConf或视图不存在时
与1~3不同,这并不是开发者故意触发的404,但如果请求者访问不存在的URL,Django将内部自动触发404。
2. 自定义方法
必备条件
- 模板名称必须为
404.html。 settings.py中应设置以下项:DEBUG = False- 设置
ALLOWED_HOSTS 404.html模板必须位于Django可以找到的位置。
模板位置
| 位置 | 说明 |
|---|---|
项目根目录/templates/404.html |
最常见且稳定的位置 |
应用名/templates/404.html |
可以,但需要 APP_DIRS = True 条件 |
应用名/templates/应用名/errors/404.html |
不会被自动识别,需要设置handler404 |
handler404 手动连接示例
# views.py
def custom_404_view(request, exception):
return render(request, 'myapp/errors/404.html', status=404)
# urls.py
handler404 = 'myapp.views.custom_404_view'
3. 403, 500错误也可以自定义吗?
✔ Django除了404外,还可以通过模板自定义以下错误页面:
| 错误代码 | 默认模板名称 | 说明 |
|---|---|---|
| 403 | 403.html |
权限不足 (Permission Denied) |
| 404 | 404.html |
找不到页面 (Not Found) |
| 500 | 500.html |
服务器内部错误 (Internal Server Error) |
| 400 | 400.html |
错误请求 (Bad Request) |
✔ 基本条件相同
- 必须是
DEBUG = False才能应用模板。 - 模板必须在
TEMPLATES['DIRS']或APP_DIRS=True路径下存在。 - 如有必要,可以手动注册
handler403、handler400、handler500将其连接到特定视图。
总结整理
| 项目 | 内容 |
|---|---|
raise Http404 使用时 |
自动渲染 404.html 模板 |
get_object_or_404() |
如果对象不存在则自动触发404 |
| 模板名称 | 必须使用 404.html、403.html 等固定名称 |
| 目录条件 | 必须在 TEMPLATES['DIRS'] 或 APP_DIRS 内部 |
| DEBUG条件 | 只有当 DEBUG = False 时用户模板才会生效 |
| 高级用法 | 可以通过 handler404、handler500等连接到特定视图 |
目前没有评论。