2009-07-01 6 views
3

J'ai une application où il y a un FormWizard avec 5 étapes, l'une d'elles ne devrait apparaître que lorsque certaines conditions sont remplies. Le formulaire est pour un assistant de paiement sur un chariot en ligne, l'une des étapes devrait seulement montrer quand il y a des promotions disponibles pour le piqûre, mais quand il n'y a pas de promotions, je veux passer cette étape au lieu de montrer un liste vide des promotions.Passer les étapes sur un django FormWizard

donc je veux avoir 2 flux possibles:

step1 - step2 - step3 

step1 - step3 

Répondre

6

La méthode crochet process_step() vous donne exactement cette occasion. Une fois le formulaire validé, vous pouvez modifier la variable self.form_list et supprimer les formulaires dont vous n'avez pas besoin. Aiguilles à dire Si votre logique est très compliquée, il est préférable de créer des vues séparées pour chaque étape/formulaire et de renoncer complètement à FormWizard.

+6

La méthode process_step() est destinée à post-traiter les données _après_ que le formulaire est soumis. Pour rendre certains formulaires facultatifs, vous pouvez introduire des conditions dans la liste des formulaires que vous passez à FormView: https://docs.djangoproject.com/fr/1.5/ref/contrib/formtools/form-wizard/#conditionally-view-skip -spécifiques – tijs

1

Je l'ai fait d'une autre manière, en remplaçant la méthode render_template. Voici ma solution. Je ne savais pas du Process_Step() ...

def render_template(self, request, form, previous_fields, step, context): 

    if not step == 0: 
     # A workarround to find the type value! 
     attr = 'name="0-type" value=' 
     attr_pos = previous_fields.find(attr) + len(attr) 
     val = previous_fields[attr_pos:attr_pos+4] 
     type = int(val.split('"')[1]) 

     if step == 2 and (not type == 1 and not type == 2 and not type == 3): 
      form = self.get_form(step+1) 
      return super(ProductWizard, self).render_template(request, form, previous_fields, step+1, context) 

    return super(ProductWizard, self).render_template(request, form, previous_fields, step, context) 
4

Pour faire certaines formes, vous pouvez introduire en option dans la liste conditionals des formes que vous passez à la FormView dans votre urls.py:

contact_forms = [ContactForm1, ContactForm2] 

urlpatterns = patterns('', 
    (r'^contact/$', ContactWizard.as_view(contact_forms, 
     condition_dict={'1': show_message_form_condition} 
    )), 
) 

Pour un exemple complet, voir les documents Django: https://django-formtools.readthedocs.io/en/latest/wizard.html#conditionally-view-skip-specific-steps

Questions connexes