如何在 Django 中正确设置自定义 handler404?

How to properly setup custom handler404 in django?

根据 documentation 这应该相当简单:我只需要定义 handler404。目前我正在做,在我的顶部 urls.py:

urlpatterns = [
    ...
]

handler404 = 'myapp.views.handle_page_not_found'

应用程序已安装。对应的视图就是(暂时我只想在404的情况下重定向到首页):

def handle_page_not_found(request):
    return redirect('homepage')

但这没有任何效果:显示标准(调试)404 页面。

文档有点含糊:

正如我们所讨论的,您的设置是正确的,但在 settings.py 中您应该 DEBUG=False。它更像是一个生产功能,不会在开发环境中工作(当然,除非你在开发机器中有 DEBUG=False)。

Debug 应为 False 并添加到视图 *args**kwargs。添加到 urls.py handler404 = 'view_404'

def view_404(request, *args, **kwargs):
return redirect('https://your-site/404')

如果我没有添加 args 和 kwargs 服务器得到 500。

要在自定义页面上呈现 404 错误响应,请执行以下操作:

在你的项目目录中打开settings.py并修改DEBUG如下:

    DEBUG = False

在同一目录中创建一个文件并将其命名为views.py,插入以下代码:

   from django.shortcuts import render

   def handler404(request, exception):
       return render(request, 'shop/shop.html')

最后打开同项目目录下的urls.py文件,添加如下代码:

   from django.contrib import admin
   from . import views

   handler404 = views.handler404

   urlpatterns = [
      path('admin/', admin.site.urls),
   ]

所有其他答案都不是最新的。以下是 Django 3.1 中对我有用的内容:

urls.py

from django.conf.urls import handler404, handler500, handler403, handler400
from your_app_name import views

handler404 = views.error_404
handler500 = views.error_500

views.py

def error_404(request, exception):
   context = {}
   return render(request,'admin/404.html', context)

def error_500(request):
   context = {}
   return render(request,'admin/500.html', context)

请注意,您必须编辑此代码以在 urls.py 的导入语句中反映您的应用程序名称,并在 views.py 中反映您的 html 模板的路径。