2013-06-27 2 views
7

В документации мастера Django я нашел такой код:Django мастера, несколько форм в одном шаге

{{ wizard.management_form }} 
{% if wizard.form.forms %} 
    {{ wizard.form.management_form }} 
    {% for form in wizard.form.forms %} 
     {{ form }} 
    {% endfor %} 
{% else %} 
    {{ wizard.form }} 
{% endif %} 

Так мне интересно, как я могу добавить несколько форм для одного шага мастера

+0

после траты на эту проблему, я наконец нашел подходящее решение : https://code.djangoproject.com/ticket/18830, но это не способ удовлетворить меня, потому что я не могу использовать цикл, который я отправлял, чтобы получить поля формы. Любые другие идеи? – mdargacz

+1

Петля используется в случае набора форм. Почему в любом случае вам нужно добавить несколько форм на одном шаге? – mariodev

+0

Возможно, вы ищете бета-версии https://docs.djangoproject.com/en/1.5/topics/forms/formsets/#django.forms.formsets.BaseFormSet – SaulTigh

ответ

3

сделать один ваших форм: Formset, содержащий остальные формы, в которых вы нуждаетесь. Вам не обязательно обязательно использовать ModelFormset, вы можете подклассифицировать базовый класс и создать формы вручную.

+0

Еще не получили ответа? – Joe

+0

Это работает только в том случае, если вы работаете с несколькими экземплярами одной и той же формы, нет? – Pieter

+0

Нет, он работает с любым сочетанием форм. – patrys

0

Это теперь не рекомендуется использовать эту ссылку: https://github.com/vikingco/django-formtools-addons

Я хотел бы поделиться мои настройки, если бы была какая-либо помощь кому-либо:

class BaseImageFormSet(BaseModelFormSet): 
    def __init__(self, *args, **kwargs): 
     super(BaseImageFormSet, self).__init__(*args, **kwargs) 
     self.queryset = Images.objects.none() 


ImageFormSets = modelformset_factory(Images, formset=BaseImageFormSet, fields=('picture',), extra=2) 

form_list = [("step1", CategoryForm), 
     ("step2", CityForm), 
     ("step3", (
      ('lastform', LastForm), 
      ('imageform', ImageFormSets) 
     )) 
     ] 

templates = {"step1": "create_post_category.html", 
      "step2": "create_post_city.html", 
      "step3": "create_post_final.html"} 




class OrderWizard(SessionMultipleFormWizardView): 
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'photos')) 


    def get_template_names(self): 
     return [templates[self.steps.current]] 


    def render(self, forms=None, **kwargs): 
     forms = forms or self.get_forms() 
     context = self.get_context_data(forms=forms, **kwargs) 

     #print(forms[1](queryset = Images.objects.none())) 
     return self.render_to_response(context) 

    def done(self, form_list, form_dict, **kwargs): 
     form_data_dict = self.get_all_cleaned_data() 
     #print(form_data_dict) 
     result = {} 
     instance = Post() 
     #print(form_dict) 
     for key in form_dict: 
      form_collection = form_dict[key] 
      #print(form_collection) 
      for key in form_collection: 
       form = form_collection[key] 
       print('printing form %s' % key) 
       #if isinstance(form, forms.ModelForm): 
       if key == 'lastform': 
        post_instance = form.save(commit=False) 

        nodes = form_data_dict.pop('nodes') 
        city = form_data_dict.pop('city') 
        post_instance.save() 

        post_instance.category.add(nodes) 
        post_instance.location.add(city) 
        print('lastfome as esu ') 

       if key == 'imageform': 
        for i in form_data_dict['formset-step3']: 
         picture = i.pop('picture') 
         images_instance = Images(post=post_instance, picture=picture) 
         images_instance.save() 







     return render_to_response('create_post_done.html', { 
      'form_data': result, 
      #'form_list': [form.cleaned_data for form in form_list], 

     })