According to the documentation this should be fairly simple: I just need to define handler404
. Currently I am doing, in my top urls.py
:
urlpatterns = [
...
]
handler404 = 'myapp.views.handle_page_not_found'
The application is installed. The corresponding view is just (for the time being I just want to redirect to the homepage in case of 404):
def handle_page_not_found(request):
return redirect('homepage')
But this has no effect: the standard (debug) 404
page is shown.
The documentation is a bit ambiguous:
handler404
be defined? The documentation says in the URLconf
but, where exactly? I have several applications, each with a different urls.py
. Can I put it in any of them? In the top URLconf
? Why? Where is this documented?django.http.Http404
, django.http.HttpResponseNotFound
, django.http.HttpResponse
(with status=404
)?As we discussed, your setup is correct, but in settings.py you should make DEBUG=False
. It's more of a production feature and won't work in development environment(unless you have DEBUG=False
in dev machine of course).
Debug should be False and add to view *args
and **kwargs
. Add to urls.py handler404 = 'view_404'
def view_404(request, *args, **kwargs):
return redirect('https://your-site/404')
If I didn't add args and kwargs server get 500.
All the other answers were not up to date. Here's what worked for me in 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)
Note, you will have to edit this code to reflect your app name in the import statement in urls.py and the path to your html templates in views.py.
To render 404 Error responses on a custom page, do the following:
In your project directory open settings.py
and modify DEBUG
as follows:
DEBUG = False
In the same directory create a file and name it views.py
, insert the following code:
from django.shortcuts import render
def handler404(request, exception):
return render(request, 'shop/shop.html')
Finally open urls.py
file which is in the same project directory and add the following code:
from django.contrib import admin
from . import views
handler404 = views.handler404
urlpatterns = [
path('admin/', admin.site.urls),
]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With