Vous n'êtes pas identifié(e).
Bonjour,
J'ai un petit souci pour afficher les erreurs issues de la validation d'un formset. Je m'explique, le clean ne se fait pas au niveau du formset mais du formulaire qui est le suivant :
formulaire :
class EventAddInvitGroupForm(forms.Form):
id_unique = forms.CharField(widget=forms.HiddenInput())
Slug = forms.CharField(widget=forms.HiddenInput())
Type = forms.CharField(widget=forms.HiddenInput())
DateConvoc = forms.DateTimeField(label ='Date et heure', widget=forms.DateTimeInput(), required = False)
def __init__(self, ....
def clean(self):
cleaned_data = super(EventAddInvitGroupForm, self).clean()
##Test de validation du formulaire
#raise forms.ValidationError(u"Ceci est un test d'erreur de validation du formulaire")
return cleaned_data
Construction du formset :
EventAddInvitGroupFormSet = formset_factory(EventAddInvitGroupForm)
EventAddInvitGroupFormSet.form = staticmethod(curry(EventAddInvitGroupForm, event=Event.id, Type = "prog"))
formset = EventAddInvitGroupFormSet(request.POST, prefix='AddGroup')
l'affichage des erreurs dans le template:
formset_errors :{{ formset.errors }}
formset_errors :{{ formset.non_form_errors }}
La méthode clean de mon formulaire fonctionne lorsque je dé commente le "raise" qui est un test. Donc lorsque je produit volontairement une erreur, le formulaire n'est pas validé mais les erreurs ne sont pas affichées.
Je dois être passé à côté de quelque chose dans la doc, est-ce que quelqu'un a une idée ?
Merci
Hors ligne
A priori, ça devrait bien fonctionner.
from django import forms
from django.forms.formsets import formset_factory
from django.utils.functional import curry
class BaseForm(forms.Form):
slug = forms.CharField(widget=forms.HiddenInput())
def __init__(self, user_id=None, *args, **kwargs):
super(BaseForm, self).__init__(*args, **kwargs)
self.user_id = user_id
def clean(self):
cleaned_data = super(BaseForm, self).clean()
raise forms.ValidationError('Some errors')
return cleaned_data
BaseFormset = formset_factory(BaseForm)
BaseFormset.form = staticmethod(curry(BaseForm, user_id=3))
data = {
'form-TOTAL_FORMS': u'2',
'form-INITIAL_FORMS': u'0',
'form-MAX_NUM_FORMS': u'',
'form-0-slug': u'myslug',
'form-1-slug': u'',
}
formset = BaseFormset(data)
formset.is_valid()
formset.errors
Ce snippet me donne:
>>> formset.errors
[{u'__all__': [u'Some errors']}, {}]
Dernière modification par Xavier Ordoquy (05-06-2013 07:14:47)
Hors ligne
Bonjour,
Merci pour votre réponse,
Je crois avoir localisé le problème qui je pense est vraiment tout bête, j'explique :
Lorsque je valide le formulaire, on dirait que la vue ne passe pas par le "render_to_response" localisé ici :
elif 'InvitGroup' in request.POST:
EventAddInvitGroupFormSet = formset_factory(EventAddInvitGroupForm)
EventAddInvitGroupFormSet.form = staticmethod(curry(EventAddInvitGroupForm, event=Event.id, Type = "prog"))
formset = EventAddInvitGroupFormSet(request.POST, prefix='AddGroup')
if formset.is_valid():
for formu in formset:
.....Toutes les opérations ici.....puis le render_to_response
return render_to_response('EventModif.html', { 'yep': 'yep yep yep','form' : form, 'formset': formset, 'form_add_manager': form_add_manager, 'Event': Event},
context_instance = RequestContext(request))
Le yep yep yep n'apparaît jamais...
Encore Merci Xavier pour vos réponses
cordialement
Hors ligne
elif 'InvitGroup' in request.POST: EventAddInvitGroupFormSet = formset_factory(EventAddInvitGroupForm) EventAddInvitGroupFormSet.form = staticmethod(curry(EventAddInvitGroupForm, event=Event.id, Type = "prog")) formset = EventAddInvitGroupFormSet(request.POST, prefix='AddGroup') if formset.is_valid(): for formu in formset: .....Toutes les opérations ici.....puis le render_to_response return render_to_response('EventModif.html', { 'yep': 'yep yep yep','form' : form, 'formset': formset, 'form_add_manager': form_add_manager, 'Event': Event}, context_instance = RequestContext(request))
Avec cette indentation, le contexte avec yep yep yep ne sera affiché que si le formulaire est valide.
Hors ligne
Oui, merci,
c'était juste un problème d'indentation qui ne permettait pas d'afficher les erreurs.
Le post peut-être considéré comme résolu.
Un grand merci à Xavier Ordoquy.
Hors ligne