Exercices Concepts Web & Django Formulaire de recherche avec filtres
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Formulaire de recherche avec filtres

En entreprise, les formulaires de recherche avec filtres sont partout : recherche de produits, filtrage de commandes, tri de résultats. Un formulaire Django est parfait pour ca car il valide et nettoie automatiquement les paramètres.

Un formulaire de recherche est généralement utilise avec des paramètres GET (pas POST), car l'URL de recherche doit etre partageable.

Crée un formulaire ProductSearchForm avec :
- query : CharField, max 200, required=False (texte de recherche)
- category : ChoiceField avec [('', 'Toutes'), ('electronics', 'Electronique'), ('clothing', 'Vetements'), ('books', 'Livres'), ('food', 'Alimentaire')], required=False
- min_price : DecimalField, min_value=0, decimal_places=2, max_digits=10, required=False
- max_price : DecimalField, min_value=0, decimal_places=2, max_digits=10, required=False
- in_stock_only : BooleanField, required=False (filtrer les produits en stock)
- sort_by : ChoiceField avec [('name', 'Nom'), ('price_asc', 'Prix croissant'), ('price_desc', 'Prix decroissant'), ('newest', 'Plus recents')], required=False

Ajoute une méthode clean qui vérifie que min_price <= max_price quand les deux sont renseignes. Leve ValidationError("Le prix minimum doit etre inferieur au prix maximum.") sinon.

Ajoute une méthode get_filters(self) qui retourne un dictionnaire des filtres actifs (seulement les champs qui ont une valeur non vide). Appelle d'abord self.is_valid().

Exemple :

form = ProductSearchForm(data={'query': 'laptop', 'category': 'electronics', 'in_stock_only': True})
form.is_valid()
filters = form.get_filters()
filters contient {'query': 'laptop', 'category': 'electronics', 'in_stock_only': True}

Tests (4/5)

Formulaire vide valide
form = ProductSearchForm(data={})
assert form.is_valid() == True
Filtres actifs
form = ProductSearchForm(data={'query': 'laptop', 'category': 'electronics'})
form.is_valid()
filters = form.get_filters()
assert filters.get('query') == 'laptop' and filters.get('category') == 'electronics'
Filtres vides exclus
form = ProductSearchForm(data={'query': 'test'})
form.is_valid()
filters = form.get_filters()
assert 'category' not in filters or filters.get('category') == ''
min_price > max_price invalide
form = ProductSearchForm(data={'min_price': '100', 'max_price': '50'})
assert form.is_valid() == False

+ 0 tests cachés

Indices (3 disponibles)

solution.py