2014-02-13 13 views
5

dynamisch setzen Als Teil einer Form Wizard in meiner Django Ansicht verwende ich eine Formset. Die Assistenten Formen für jeden Schritt werden wie folgt erklärt:Django: Formset für Schritt in Form Wizard

UserFormSet = modelformset_factory(account_models.MyUser, 
            form=account_forms.MyUserForm, 
            extra=5, 
            max_num=10, 
            can_delete=True) 

FORMS = [('userchoice', UserChoiceForm), 
     ('user', UserFormSet),] 
TEMPLATES = {'userchoice': "account/userchoice.html", 
      'user': "account/user.html",} 

Was ich versuche, dies zu erreichen ist: In UserChoiceForm (erster Schritt) die Anzahl der erforderlichen Benutzer eingestellt werden können. Ich möchte diesen Wert verwenden, um das Attribut extra auf UserFormSet dynamisch festzulegen, sodass nur die erforderliche Anzahl von Formularen im zweiten Schritt angezeigt wird.

Ich versuche, dies zu tun, indem die get_form() Methode des Assistenten überschreiben:

class MyUserWizard(SessionWizardView): 
def get_form(self, step=None, data=None, files=None): 
    form = super(MyUserWizard, self).get_form(step, data, files) 

    # Determine the step if not given 
    if step is None: 
     step = self.steps.current 

    if step == 'user': 
     # Return number of forms for formset requested 
     # in previous step. 
     userchoice = self.get_cleaned_data_for_step('userchoice') 
     num_users = userchoice['num_users'] 
     CoFunderFormSet.extra = num_users 
     return CoFunderFormSet 
    return form 

Mit diesem Ansatz, den ich bin in der Lage, die richtige Menge von Formen für den zweiten Schritt angezeigt zu bekommen, aber wenn man versucht, die Formset posten ich beende mit diesem Fehler auf:

[u'ManagementForm data is missing or has been tampered with'] 

Die POST-Daten die erwarteten Management Formularfelder festgelegt hat, zB

form-TOTAL_FORMS u'1' 

aber ich nehme an, die FormWizard die Formset verwendet, die in der Anfangs FORMS Liste und damit die Managementformen eingestellt wurde nicht übereinstimmen.

Ich frage mich, ob es eine Lösung dafür gibt und ob es eine Möglichkeit gibt, dem FormWizard mitzuteilen, stattdessen das dynamisch generierte Formset für POST zu verwenden.

Antwort

0

Wenn Sie diese Fehlermeldung erhalten,

[u'ManagementForm data is missing or has been tampered with']

in Ihrer Vorlage stellen Sie sicher, dass Sie {{ wizard.form.management_form }} gegeben haben.

4

Sie get_form_initial außer Kraft setzen kann, vorausgesetzt, dass Sie bereits Ihre form_list wie folgt festgelegt haben:

form_list = [ 
     (FIRST_STEP, forms.FirstForm), 
     (SECOND_STEP, modelformset_factory(Second_model, form=forms.SecondForm)), 
    ] 

def get_form_initial(self, step): 
     """ 
     Set extra parameter for step2, which is from clean data of step1. 
     """ 
     if step == self.SECOND_STEP: 
      form_class = self.form_list[step] 
      data = self.get_cleaned_data_for_step(self.FIRST_STEP) 
      if data is not None: 
       extra = get_extra_count(data) # use cleaned data calculate extra 
       form_class.extra = extra 
     return super(PackageWizard, self).get_form_initial(step) 
+0

wie ein Zauber, dank Das funktionierte! :) – littlepea

+0

Dieser Ansatz funktioniert, es sei denn, Sie verwenden Multi-Threading, da es nicht threadsicher ist. Ein threadsafe Ansatz könnte sein, überschreiben 'get_form' und erstellen Sie Ihre Formsets dynamisch. – lukewarm

Verwandte Themen