Lorsque vous développez avec Django, il est fréquent de vouloir afficher une page 404 personnalisée en utilisant un code comme raise Http404("Page not found.").
Dans cet article, nous allons examiner de manière pratique les causes d'apparition de l'erreur 404, comment connecter les modèles, et la gestion des erreurs 403/500.

1. Moyens représentatifs de provoquer une erreur 404
Nous avons catégorisé les cas où une erreur 404 se produit dans Django, et il semble que cela pourrait être l'un des 4 cas suivants.
1. raise Http404("Description")
C'est la méthode la plus basique pour provoquer explicitement une erreur 404.
from django.http import Http404
def my_view(request):
if not condition:
raise Http404("Page not found.")
2. get_object_or_404()
C'est une fonction utilitaire fréquemment utilisée dans Django. Elle génère automatiquement une erreur 404 si l'objet n'existe pas.
from django.shortcuts import get_object_or_404
post = get_object_or_404(Post, pk=pk)
3. Gestion des exceptions après utilisation de Model.objects.get()
Dans ce cas, vous devez également provoquer manuellement une erreur 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. Lorsque le URLConf ou le View n'existe pas
Contrairement aux 1~3 ci-dessus, ce n'est pas une erreur 404 que le développeur a intentionnellement provoquée, mais lorsque l'utilisateur accède à une URL qui n'existe pas, Django génère automatiquement une erreur 404 en interne.
2. Méthodes de personnalisation
Conditions préalables
- Le nom du modèle doit être
404.html. - Les éléments suivants doivent être configurés dans
settings.py: DEBUG = FalseALLOWED_HOSTSconfiguré- Le modèle
404.htmldoit être dans un emplacement accessible à Django.
Position du modèle
| Position | Description |
|---|---|
projet_root/templates/404.html |
Position la plus courante et fiable |
app_name/templates/404.html |
Possible mais nécessite APP_DIRS = True |
app_name/templates/app_name/errors/404.html |
Non reconnu automatiquement, nécessite une configuration de handler404 |
Exemple de connexion manuelle par 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. Est-il possible de personnaliser les erreurs 403 et 500 ?
✔ Django permet de personnaliser les pages d'erreur suivantes en plus de la 404 :
| Code d'erreur | Nom du modèle par défaut | Description |
|---|---|---|
| 403 | 403.html |
Accès refusé (Permission Denied) |
| 404 | 404.html |
Page non trouvée (Not Found) |
| 500 | 500.html |
Erreur interne du serveur (Internal Server Error) |
| 400 | 400.html |
Demande incorrecte (Bad Request) |
✔ Les conditions de base sont identiques
- Le modèle ne sera appliqué que si
DEBUG = False. - Le modèle doit exister sous
TEMPLATES['DIRS']ou en utilisantAPP_DIRS=True. - Si nécessaire, les handlers
handler403,handler400,handler500peuvent être enregistrés manuellement pour les relier à des vues spécifiques.
Résumé
| Élément | Contenu |
|---|---|
Lors de l'utilisation de raise Http404 |
Rendu automatique du modèle 404.html |
get_object_or_404() |
Provoque automatiquement une erreur 404 si l'objet est introuvable |
| Nom de modèle | Utiliser impérativement un nom fixe comme 404.html, 403.html, etc. |
| Conditions de répertoire | Doit être à l'intérieur de TEMPLATES['DIRS'] ou APP_DIRS |
| Conditions DEBUG | Le modèle utilisateur est appliqué uniquement lorsque DEBUG = False |
| Utilisation avancée | Possibilité de relier à des vues spécifiques via handler404, handler500, etc. |
Aucun commentaire.