2013-06-27 10 views
7

Trong tài liệu hướng dẫn của Django Hướng dẫn tôi tìm thấy mã như thế này:Django Wizard, nhiều hình thức trong một bước

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

Vì vậy, tôi tự hỏi làm thế nào tôi có thể thêm nhiều hình thức để bước duy nhất của wizard

+0

sau khi dành hàng giờ cho vấn đề này, cuối cùng tôi đã tìm thấy giải pháp có vẻ như : https://code.djangoproject.com/ticket/18830 nhưng nó không phải là một cách đáp ứng tôi, bởi vì tôi không thể sử dụng một vòng lặp như tôi được đăng để có được các lĩnh vực hình thức. Bất kỳ ý tưởng nào khác? – mdargacz

+1

vòng lặp được sử dụng trong trường hợp một bộ định dạng. Tại sao bạn cần thêm nhiều biểu mẫu trong một bước? – mariodev

+0

có thể bạn đang tìm kiếm các biểu mẫu https://docs.djangoproject.com/en/1.5/topics/forms/formsets/#django.forms.formsets.BaseFormSet – SaulTigh

Trả lời

3

Thực hiện một các biểu mẫu của bạn là Formset có chứa các biểu mẫu còn lại bạn cần. Bạn không nhất thiết phải sử dụng một số ModelFormset, bạn có thể phân lớp lớp cơ sở và tạo biểu mẫu theo cách thủ công.

+0

Không có sự chấp thuận của câu trả lời chưa? – Joe

+0

Điều này chỉ hoạt động nếu bạn đang làm việc với nhiều phiên bản của cùng một biểu mẫu, phải không? – Pieter

+0

Không, nó hoạt động với bất kỳ sự kết hợp nào của biểu mẫu. – patrys

0

này bây giờ bị phản đối sử dụng liên kết này: https://github.com/vikingco/django-formtools-addons

tôi muốn chia sẻ cài đặt của tôi nếu có bất kỳ sự trợ giúp nào cho bất kỳ ai:

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], 

     })