2013-10-15 2 views
1

Я использую Django 1.4.8Джанго бесконечный цикл Мастер форм

I am able to dynamically change the form from a choice made on the previous step, но теперь мне нужно, чтобы быть более точным.

Фактически, в моей форме «шаг 0» у меня есть выпадающее меню, откуда я выбираю значение, а затем на шаге 2 мне нужно загрузить те же данные, что и «шаг 0», без выбранного значения на шаге 0.

Я сделал это так:

urls.py:

# wizard 
url(r'^service/create/$', 
    UserServiceWizard.as_view([ProviderForm, 
           DummyForm, 
           ConsummerForm, 
           DummyForm, 
           ServicesDescriptionForm]), 

views.py

def get_form(self, step=None, data=None, files=None): 
    """ 
     change the form instance dynamically from the data we entered 
     at the previous step 
    """ 
    # 
    if step is None: 
     step = self.steps.current 

    if step == '1': 

     prev_data = self.get_cleaned_data_for_step('0') 
     service_name = str(prev_data['provider']).split('Service')[1] 
     class_name = 'th_' + service_name.lower() + '.forms' 
     form_name = service_name + 'ProviderForm' 
     form_class = class_for_name(class_name, form_name) 
     form = form_class(data) 

    elif step == '2': 
     data = self.get_cleaned_data_for_step('0') 
     form = ConsummerForm(initial={'provider': data['provider']}) 

     # EDIT 10/16 @ 10:00 
     # to track what's wrong I added 
     print form['consummer'].errors #return nothing 
     print form.is_valid() #return false 
     print "form.non_field_errors ", form.non_field_errors() #return nothing 


    elif step == '3': 

     prev_data = self.get_cleaned_data_for_step('2') 
     service_name = str(prev_data['consummer']).split('Service')[1] 
     class_name = 'th_' + service_name.lower() + '.forms' 
     form_name = service_name + 'ConsummerForm' 
     form_class = class_for_name(class_name, form_name) 
     form = form_class(data) 

    else: 
     form = super(UserServiceWizard, self).get_form(step, data, files) 

    return form 

моих форм является:

class ServiceChoiceForm(forms.Form): 

    def activated_services(self, provider=None): 
     """ 
     get the activated services added from the administrator 
     """ 
     services = ServicesActivated.objects.filter(status=1) 

     choices = [] 
     datas =() 

     if provider is not None: 
      services = services.exclude(name__exact=provider) 

     for class_name in services: 
      datas = (class_name, class_name.name.rsplit('Service', 1)[1]) 
      choices.append(datas) 

     return choices 

class ProviderForm(ServiceChoiceForm): 

    provider = forms.ChoiceField() 

    def __init__(self, *args, **kwargs): 
     super(ProviderForm, self).__init__(*args, **kwargs) 
     self.fields['provider'].choices = self.activated_services() 


class ConsummerForm(ServiceChoiceForm): 

    consummer = forms.ChoiceField() 

    def __init__(self, *args, **kwargs): 
     super(ConsummerForm, self).__init__(*args, **kwargs) 
     # get the list of service without the one selected in 
     # the provider form 
     self.fields['consummer'].choices = self.activated_services(
      self.initial['provider']) 

Теперь то, что случилось:

, когда я на форме "шаг 2" и отправить данные ... Я возвращаюсь к «шаг 2 "неопределенно

Если я не положил часть elif step == '2' в get_form() и поставить тот же код в виде образуют ConsummerForm:

self.fields['consummer'].choices = self.activated_services() 

тогда процесс продолжается, но это не то, что я хочу :(

последние вещи «= Я заметил, что get_form() называется слишком много раз после того, как„шаг 0“: на самом деле в 4 раза , Я отслеживал это с print form,step в get_form(), но форма никогда не была ожидаемой.

Если кто-нибудь может объяснить мне, как я могу исправить поведение цикла infite в мастере; я был бы признателен за много;)

+0

То, что вы делаете с волшебником формы джанго, никогда не перестает удивлять меня. –

+0

Представьте себе, как только он сработает :-) –

+0

Этот вопрос не соответствует теме, потому что речь идет о очень локализованной проблеме. – Rohan

ответ

0

Я нашел решение:

на шаге 2 я должен сделать это

elif step == '2': 
     step0_data = self.get_cleaned_data_for_step('0') 
     form = ConsummerForm(
      data, initial={'provider': step0_data['provider']}) 

вместо

elif step == '2': 
     data = self.get_cleaned_data_for_step('0') 
     form = ConsummerForm(initial={'provider': data['provider']}) 

потому, что в 1-ом я не сделал перезаписать «данные», как я сделал случайно в 2-й части кода ...

сейчас все, что угодно орки БОЛЬШИЕ!