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.
wie ein Zauber, dank Das funktionierte! :) – littlepea
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