Développer une application web accessible avec Django

PROJET ETUDIANT : Application web avec Django                      


Dans ce projet, j’ai travaillé sur la conception d’une application web avec Django intégrant un système complet d’authentification, de création de contenus et d’interactions sociales.

Ce projet m’a permis de concevoir une architecture backend robuste en Django, en mettant en œuvre les vues basées sur les fonctions (FBV), les formulaires Django, la gestion des permissions et la protection contre les attaques CSRF. J’ai travaillé sur la modélisation des relations entre utilisateurs (abonnements), la gestion des médias (upload et affichage d’images), ainsi que la construction d’un feed combinant plusieurs types de contenus ordonnés chronologiquement.

J’ai également porté une attention à la qualité de l’interface utilisateur : structuration des templates, factorisation des composants, accessibilité conforme aux recommandations WCAG (contrastes, navigation clavier, sémantique HTML) et responsive design.

Enfin, ce projet m’a permis d’approfondir des notions clés telles que la validation des formulaires, la pagination, la personnalisation des messages d’erreur et la séparation claire des responsabilités entre modèles, vues et templates (MVT).


Problématiques rencontrées :

1. Sécurité des accès par URL

Problème :
Les actions sensibles (modifier/supprimer un ticket ou une review) restaient accessibles via URL directe, même sans bouton visible.

Solution :
Vérification côté vue avec filtrage par user=request.user.

Ce que j’ai appris :

  • La sécurité ne doit jamais reposer sur le template

  • Toujours valider les permissions côté serveur

  • Importance de get_object_or_404 avec conditions

2. Création multiple de reviews sur un même ticket

Problème :
Un utilisateur pouvait créer plusieurs critiques pour un même ticket via accès direct à l’URL.

Solution :
Ajout d’une vérification avec .filter(...).exists() avant création.

Ce que j’ai appris :

  • Implémenter des règles métier côté backend

  • Anticiper les contournements via requêtes directes

  • Différence entre validation UI et validation serveur

3. Gestion d’un feed combinant plusieurs modèles

Problème :
Fusionner et trier des tickets et des reviews dans un seul flux.

Solution :
Concaténation des QuerySets + tri sur un attribut commun (time_created).

Ce que j’ai appris :

  • Manipulation de collections hétérogènes

  • Importance d’un attribut commun pour le tri

  • Limites de cette approche (performance, pagination)

4. Validation des formulaires et UX

Problème :
Messages d’erreur peu clairs et validation incomplète (ex : mot de passe).

Solution :
Utilisation des validateurs Django + personnalisation des messages.

Ce que j’ai appris :

  • Fonctionnement du cycle clean() dans les forms

  • Différence entre validation Django et validation personnalisée

  • Importance de l’UX dans les formulaires

5. Accessibilité (WCAG)

Problème :
Rendre l’application utilisable pour tous (contrastes, navigation, lisibilité).

Solution :
Amélioration des contrastes, balises sémantiques, mode “contraste +”.

Ce que j’ai appris :

  • Bonnes pratiques WCAG

  • Importance de la sémantique HTML

  • Impact de l’accessibilité sur l’UX globale


En quelques mots-clés :

Backend / Django

  • Django
  • Python
  • Architecture MVC / MTV
  • Function-Based Views (FBV)
  • Django Forms / ModelForms
  • Validation des formulaires
  • Authentification utilisateur
  • Permissions et sécurité
  • CSRF protection
  • ORM Django
  • Relations One-to-Many / Many-to-Many
  • Pagination
  • Upload et gestion de fichiers médias

Frontend / UI

  • HTML5 sémantique
  • CSS
  • Responsive design
  • Accessibilité web (WCAG)
  • Contrastes et lisibilité
  • UI/UX
  • Templates Django
  • Composants réutilisables

Méthodologie

  • Séparation des responsabilités
  • Clean code
  • Factorisation CSS
  • Gestion des erreurs
  • Debugging
  • Documentation (README)
  • Développement full-stack


V01

Le code source : repository GitHub

Exemple d’exécution



A bientôt ! 😉