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 = False
ALLOWED_HOSTS
configuré- 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 utilisantAPP_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. |
Add a New Comment