2011-11-30 5 views
0

je me suis écrit un formulaire:Django modèle de formulaire erreurs

class Autopoweroff_Form(forms.Form): 
    autopoweroff_groups = forms.CharField(required=True) 
    autopoweroff_groups_hosts = forms.CharField(required=True) 
    autopoweroff_groups_start = forms.CharField(required=True) 
    autopoweroff_groups_end = forms.CharField(required=True) 
    autopoweroff_groups_startup_delay = forms.CharField(required=True) 
    autopoweroff_groups_idle_time = forms.CharField(required=True) 

Maintenant, je sais que je ne devrais pas mettre reuqired = True explicitement, mais pour le supporter maintenant s'il vous plaît. De toute façon, appuyons sur.

Maintenant que je déteste faire la validation et ainsi de suite dans l'opinion que je viens de définir une fonction de mise à jour pour cette forme:

def update(self, data): 
     if not self.is_bound and data is not None: 
      raise Exception() 

     if self.is_valid(): 
      curr_group = self.cleaned_data['autopoweroff_groups'] 
      ... 

puis à mon avis appeler comme ceci:

if request.method == 'POST': 
     form = Autopoweroff_Form(data=request.POST) 
     form.update(data=request.POST) 
     return HttpResponseRedirect('/admin/thin/create_autopoweroff') 
    else: 
     form = Autopoweroff_Form() 

    ... 

Maintenant, le problème est que si je ne tape rien dans le formulaire, le formulaire est retourné tel quel sans afficher les erreurs comme il le devrait. Je sais aussi qu'il ne fera pas quoi que ce soit parce que:

https://docs.djangoproject.com/en/1.3/ref/forms/validation/

En fait, Django essuiera actuellement complètement le dictionnaire cleaned_data s'il y a des erreurs dans la forme. Cependant, ce comportement peut changer dans le futur, donc ce n'est pas une mauvaise idée de nettoyer après vous en premier lieu.

si je tente:

def update(self, data): 
     if not self.is_bound and data is not None: 
      raise Exception() 

     if self.is_valid(): 
      curr_group = self.cleaned_data['autopoweroff_groups'] 
      ... 
     else: 
      print self.errors 

Je reçois les erreurs que je l'aurais aimé voir dans le modèle. Je aussi déjà essayé:

def clean_autopoweroff_groups(self): 
     autopoweoff_groups = self.cleaned_data.get('autopoweroff_groups', "") 
     if autopoweoff_groups == '': 
      print "Validation Error" 
      raise forms.ValidationError('Please Enter A Name') 
     return autopoweroff_groups 

Qu'est-ce que exactement je fais mal?

MISE À JOUR: à mon avis:

if request.method == 'POST': 
     form = Autopoweroff_Form(data=request.POST) 

     if form.is_valid(): 
      form.update(data=request.POST) 
      return HttpResponseRedirect('/admin/thin/create_autopoweroff') 
    else: 
     form = Autopoweroff_Form() 

et ma forme enlever si self.is_valid()

Répondre

0

Django a construit dans la validation de sorte que vous n'avez pas besoin de le réécrire:

class Autopoweroff_Form(forms.Form): 
    # I suggest not prefixing your fields with the name of the class 
    groups = forms.CharField(required=True) 
    hosts = forms.CharField(required=True) 
    start = forms.CharField(required=True) 
    end = forms.CharField(required=True) 
    delay = forms.CharField(required=True) 
    idle_time = forms.CharField(required=True) 

et à votre avis:

if request.method == 'POST': 
    form = Autopoweroff_Form(data=request.POST) 
    if form.is_valid(): 
     return HttpResponseRedirect('/admin/thin/create_autopoweroff') 
else: 
    form = Autopoweroff_Form() 

notez que vous appelez is_valid() dans la vue, pas le formulaire.

Si vous souhaitez effectuer une validation plus compliquée sur des champs individuels ou sur un groupe de champs, vous pouvez remplacer les méthodes clean() et clean_[field_name]().

Voir ici:

https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

+0

Merci beaucoup –

Questions connexes