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.
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
- De sjabloonnaam moet
404.html
zijn. - De volgende instellingen moeten in
settings.py
zijn geconfigureerd: DEBUG = False
ALLOWED_HOSTS
moet geconfigureerd zijn.- 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']
ofAPP_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. |
댓글이 없습니다.