Wanneer je ontwikkelt in Django, komt het vaak voor dat je een aangepaste 404-pagina wilt weergeven via code zoals raise Http404("Page not found.").
In dit artikel worden oorzaken van 404-fouten, hoe je sjablonen verbindt, en hoe je met 403/500-fouten omgaat op een praktische manier behandeld.

Illustratie van een aangepaste 404-foutpagina voor Django


1. Veelvoorkomende manieren om een 404-fout te veroorzaken

Ik heb de gevallen waarin een 404-fout in Django kan optreden gecategoriseerd, en ik denk dat er ongeveer 4 hoofdmethoden zijn.

1. raise Http404("omschrijving")

Dit is de meest basale manier om expliciet een 404-fout te genereren.

from django.http import Http404

def my_view(request):
    if not condition:
        raise Http404("Page not found.")

2. get_object_or_404()

Een veelgebruikte shortcut-functie in Django. Deze genereert automatisch een 404 als het object niet bestaat.

from django.shortcuts import get_object_or_404

post = get_object_or_404(Post, pk=pk)

3. Exceptions afhandelen na gebruik van Model.objects.get()

In dit geval moet je ook handmatig een 404 genereren.

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. Wanneer de URLConf of View niet bestaat

In tegenstelling tot de eerdere 1-3, is dit niet opzettelijk door de ontwikkelaar veroorzaakt, maar als een gebruiker toegang probeert te krijgen tot een niet-bestaande URL, genereert Django intern automatisch een 404.


2. Hoe aan te passen

Vereisten

  1. De sjabloonnaam moet 404.html zijn.
  2. De volgende instellingen moeten in settings.py zijn geconfigureerd:
  3. DEBUG = False
  4. ALLOWED_HOSTS moet geconfigureerd zijn.
  5. Het 404.html sjabloon moet op een locatie staan die Django kan vinden.

Locatie van sjablonen

Locatie Beschrijving
project root/templates/404.html De meest gebruikelijke en betrouwbare locatie.
appnaam/templates/404.html Mogelijk, maar APP_DIRS = True is vereist.
appnaam/templates/appnaam/errors/404.html Wordt niet automatisch herkend, vereist instellen van handler404.

Voorbeeld van handmatige koppeling via 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. Kun je ook 403 en 500 fouten aanpassen?

✔ Django staat toe dat je naast 404 ook de volgende foutpagina's aanpast:

Foutcode Standaard sjabloonnaam Beschrijving
403 403.html Geen toestemming (Permission Denied)
404 404.html Pagina niet gevonden (Not Found)
500 500.html Interne serverfout (Internal Server Error)
400 400.html Ongeldig verzoek (Bad Request)

✔ De basisvoorwaarden zijn dezelfde

  • DEBUG = False moet zijn ingesteld zodat de sjablonen worden toegepast.
  • De sjablonen moeten zich bevinden onder TEMPLATES['DIRS'] of APP_DIRS=True paden.
  • Indien nodig, kunnen handler403, handler400, handler500 handmatig worden geregistreerd voor bepaalde views.

Samenvatting

Item Inhoud
raise Http404 gebruiken Automatische rendering van het 404.html sjabloon.
get_object_or_404() Genereert automatisch een 404 als het object niet bestaat.
Naam van sjabloon Moet altijd 404.html, 403.html etc. met vaste namen zijn.
Directoryvoorwaarden Moet binnen TEMPLATES['DIRS'] of APP_DIRS zijn.
DEBUG-voorwaarden Gebruikerssjablonen worden alleen toegepast als DEBUG = False.
Geavanceerd gebruik Specifieke views kunnen worden gekoppeld via handler404, handler500 enz.