Exercices Concepts Web & Django Vue complete avec formulaire
🎉

Bravo!

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

Vue complete avec formulaire

Maintenant, assemblons tout : un formulaire Django utilise dans une vraie vue. C'est le pattern le plus courant en Django.

Le cycle classique d'une vue avec formulaire :

1. GET : afficher le formulaire vide
2. POST : recevoir les données, valider, traiter si OK, reafficher avec erreurs sinon

En Django, ca donne :

def ma_vue(request):
if request.method == 'POST':
form = MonForm(data=request.POST)
if form.is_valid():
# Traiter les données
return HttpResponse('Merci!')
# Formulaire invalide : sera reaffiche avec les erreurs
else:
form = MonForm()
# Ici on retournerait normalement render(request, 'template.html', {'form': form})
# Mais pour nous, on va retourner du JSON

Crée d'abord un formulaire FeedbackForm avec :
- name : CharField, max 100
- email : EmailField
- rating : IntegerField, min_value=1, max_value=5
- comment : CharField, widget=forms.Textarea, required=False

Puis crée une fonction vue feedback_view(request) qui :
- Si GET : retourne JsonResponse avec {'form_fields': ['name', 'email', 'rating', 'comment']}
- Si POST : valide le formulaire avec request.POST
- Si valide : retourne JsonResponse avec {'success': True, 'data': form.cleaned_data} (status 200). Attention : cleaned_data peut contenir des types non serialisables. Convertis le contenu en strings avec un dict comprehension.
- Si invalide : retourne JsonResponse avec {'success': False, 'errors': form.errors} (status 400). Note : form.errors est un ErrorDict, convertis-le en dict classique avec dict(form.errors).
- Sinon : retourne JsonResponse avec {'error': 'Méthode non autorisee'} (status 405)

Exemple :

from django.http import QueryDict
req = HttpRequest()
req.method = 'POST'
req.POST = QueryDict('name=Alice&email=a@b.com&rating=5&comment=Super')
resp = feedback_view(req)
json.loads(resp.content)['success'] vaut True

Tests (3/4)

GET retourne les champs
req = HttpRequest()
req.method = 'GET'
resp = feedback_view(req)
data = json.loads(resp.content)
assert 'form_fields' in data and 'name' in data['form_fields']
POST valide
req = HttpRequest()
req.method = 'POST'
req.POST = QueryDict('name=Alice&email=a@b.com&rating=5&comment=Super')
resp = feedback_view(req)
data = json.loads(resp.content)
assert data['success'] == True
POST invalide
req = HttpRequest()
req.method = 'POST'
req.POST = QueryDict('name=&email=bad&rating=10')
resp = feedback_view(req)
assert resp.status_code == 400
data = json.loads(resp.content)
assert data['success'] == False and 'errors' in data

+ 0 tests cachés

Indices (3 disponibles)

solution.py