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.

Illustration de la personnalisation de la page d'erreur 404 pour Django


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

  1. Le nom du modèle doit être 404.html.
  2. Les éléments suivants doivent être configurés dans settings.py :
  3. DEBUG = False
  4. ALLOWED_HOSTS configuré
  5. Le modèle 404.html doit ê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 utilisant APP_DIRS=True.
  • Si nécessaire, les handlers handler403, handler400, handler500 peuvent ê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.