2009-07-01 5 views
3

У меня есть приложение, в котором есть FormWizard с 5 шагами, один из них должен появляться только при выполнении некоторых условий.Пропустить шаги на django FormWizard

Форма предназначена для мастера оплаты в онлайновой тележке, один из шагов должен показывать только, когда есть рекламные акции, доступные для пикника, но когда нет рекламных акций, я хочу пропустить этот шаг, вместо того, чтобы показывать пустой список рекламных акций.

Так что я хочу иметь 2 возможных потоков:

step1 - step2 - step3 

step1 - step3 

ответ

6

Метод крючок process_step() дает вам именно такую ​​возможность. После того, как форма подтверждена, вы можете изменить переменную self.form_list и удалить формы, которые вам не нужны.

Иглы, чтобы сказать, что если логика очень сложная, вам лучше обслуживать создание отдельных представлений для каждого шага/формы и вообще отказаться от FormWizard.

+6

Метод process_step() предназначен для последующей обработки данных _after_ формы. чтобы сделать определенные формы необязательными, вы можете ввести условные обозначения в список форм, которые вы передаете FormView: https://docs.djangoproject.com/en/1.5/ref/contrib/formtools/form-wizard/#condition-view-skip -специфические-шаги – tijs

1

Я сделал это другим способом, переопределив метод render_template. Вот мое решение. Я не знал о 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

Для того, чтобы определенные формы опционно можно ввести условные в списке форм вы передаете FormView в вашем urls.py:

contact_forms = [ContactForm1, ContactForm2] 

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

Полный пример см. В документах Django: https://django-formtools.readthedocs.io/en/latest/wizard.html#conditionally-view-skip-specific-steps

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