2015-09-23 4 views
1

Я пытаюсь создать django formwizard, где первая форма имеет поле выбора, сгенерированное во время выполнения. Я могу сгенерировать форму с правильными вариантами, но когда я нажимаю кнопку отправки, модуль формы не переходит к следующему шагу. Он отправляет форму, но возвращает форму form1. Вот мои формы и видDjango Formwizard с динамической формой не переходит к следующему шагу

##Forms 
class EventForm1(forms.Form): 
    def __init__(self, *args, **kwargs): 
     ##Get choices at runtime 
     choices = kwargs.pop('loan_choices', []) 
     super(EventForm1, self).__init__(*args, **kwargs) 
     self.fields['loan'] = forms.ChoiceField(choices=choices, required=False, widget=forms.Select(attrs={'class':'events_loan_name', 'event_attribute':'loan', 'name':'loan'})) 
    attribute_to_change = forms.ChoiceField(choices=[('monthly_payment','Monthly Payment'), ('interest_rate','Interest Rate')], widget=forms.Select(attrs={'class': 'attribute_to_change', 'name':'attribute_to_change', 'event_attribute':'attribute_to_change'})) 

class EventForm2(forms.Form): 
    start_date = forms.DateField(widget=forms.TextInput(attrs={'class': 'event_dates','start_date':'start_date', 'name':'event_start_date', 'event_attribute':'start_date'})) 

##Views 
class EventFormWizard(SessionWizardView): 
    """Form wizard for adding an event""" 

    def done(self, form_list, **kwargs): 
     self.finalize_new_event(form_list) 
     return HttpResponseRedirect('/') 

    def get_form(self, step=None, data=None, files=None): 
     form = super(EventFormWizard, self).get_form(step, data, files) 

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

     print(step, form) 
     if step == "0": 
      loan_sessions = self.request.session.get('loan_sessions', None) 
      if loan_sessions != None: 
       loan_sessions = pickle.loads(self.request.session['loan_sessions']) 
      else: 
       loan_sessions = [] 

      loan_choices = [] 
      for loan_session in loan_sessions: 
       loan_choice = (loan_session['number'], loan_session['name']) 
       loan_choices.append(loan_choice) 

      ##Update the choices for the select 
      form = EventForm1(loan_choices=loan_choices) 

     return form 

    def finalize_new_loan(self, form_list): 
     """Adds a autmatic properties to the new loan, saves it to the loan_sessions and deletes the new loan object from the session""" 

     for form in form_list: 
      cleaned_data = form.cleaned_data 
      print(cleaned_data) 

Я использую django 1.8 с пакетом форм-инструментов.

+0

Насколько я могу сказать, что я делаю то же самое, предложенные в этой статье [ссылка] (http://stackoverflow.com/questions/26346381/dynamically-populating -choicefield-in-django) –

+0

Отправьте свой код шаблона также –

+0

Я просто использую шаблон по умолчанию для мастера формы. Вот ссылка [link] (https://github.com/django/django-formtools/blob/master/formtools/templates/formtools/wizard/wizard_form.html) –

ответ

1

Я обнаружил, что происходит. Метод поста мастера форм называет get_form так:

 # get the form for the current step 
     form = self.get_form(data=self.request.POST, files=self.request.FILES) 

     print(form.is_valid(), form.errors, form.is_bound) 
     # and try to validate 
     if form.is_valid(): 
      # if the form is valid, store the cleaned data and files. 
      self.storage.set_step_data(self.steps.current, 
             self.process_step(form)) 
      self.storage.set_step_files(self.steps.current, 
             self.process_step_files(form)) 

      # check if the current step is the last step 
      if self.steps.current == self.steps.last: 
       # no more steps, render done view 
       return self.render_done(form, **kwargs) 
      else: 
       # proceed to the next step 
       return self.render_next_step(form) 
     return self.render(form) 

Это вызывает только форму следующего шага, если текущая форма подтверждает, что он никогда не делает, потому что мой заказ get_form крюк не проверяет данные о POST при создании динамическая форма. Во всяком случае здесь рабочий обычай get_form крюк:

def get_form(self, step=None, data=None, files=None): 
     form = super(EventFormWizard, self).get_form(step, data, files) 

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

     if step == "0": 
      loan_sessions = self.request.session.get('loan_sessions', None) 
      if loan_sessions != None: 
       loan_sessions = pickle.loads(self.request.session['loan_sessions']) 
      else: 
       loan_sessions = [] 

      loan_choices = [] 
      for loan_session in loan_sessions: 
       loan_choice = (loan_session['number'], loan_session['name']) 
       loan_choices.append(loan_choice) 

      ##Pass the data when initing the form, which is the POST 
      ## data if the got_form function called during a post 
      ## or the self.storage.get_step_data(form_key) if the form wizard 
      ## is validating this form again in the render_done method 
      form = EventForm1(loan_choices=loan_choices, data=data) 

     return form 
Смежные вопросы