Django-fr

Forum

#1 04-06-2013 14:31:51

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Formset-Forms Clean affichage des erreurs

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

#2 05-06-2013 07:14:08

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : Formset-Forms Clean affichage des erreurs

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

#3 06-06-2013 08:14:25

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : Formset-Forms Clean affichage des erreurs

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

#4 07-06-2013 06:37:02

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : Formset-Forms Clean affichage des erreurs

torrak a écrit :
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

#5 11-06-2013 08:12:05

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : Formset-Forms Clean affichage des erreurs

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

Pied de page des forums