title: Construct crispy forms layouts iteratively?
body: <p>I'm currently trying to render a form that will allow our users to edit products, currently the form is being displayed all as one long column. </p>
  
  <p>It has been requested that I split it into two columns but am having issues due to the <code>ModelForm</code> being generated using <code>modelform_factory()</code></p>
  
  <p>Is there any way in which I can generate a Crispy layout object that can insert new div's every two form objects?</p>
  
  <p>Note: the length of the form is not known beforehand.</p>
  
  <p>View Code:</p>
  
  <pre><code>def layout_from_form(form, columns=2):
      field_count = sum(1 for i in form)  # form specified it's iterable but is not len() friendly
      for field_number, _ in enumerate(form):
  
          if field_number % columns == 0:
  
              max_length_field = field_number + 2
              if field_number + 2 &gt; field_count:
                  max_length_field = field_count
              try:
                  selected_forms = form.helper[field_number:max_length_field]
                  selected_forms.wrap(Div, css_class="span6")
                  selected_forms.wrap_together(Div, css_class="row-fluid")
              except:
                  assert False, (field_count, field_number, max_length_field)
  
  
  def edit_product(request, bought_in_control_panel_id, item_uuid):
  
      boughtin_model = get_model_for_bought_in_control_panel(bought_in_control_panel_id)
      item = boughtin_model.objects.get(pk=item_uuid)
      BoughtinForm = modelform_factory(boughtin_model, exclude=("uuid", "date_time_updated", "date_time_created",
                                                                "manufacturer"))
      if request.method == "POST":
          boughtin_form = BoughtinForm(request.POST, instance=item)
          if boughtin_form.is_valid():
              boughtin_form.save()
              return redirect(reverse('view_product', kwargs={'bought_in_control_panel_id': bought_in_control_panel_id,
                                                              'item_uuid': item_uuid}))
      else:
          boughtin_form = BoughtinForm(instance=item)
  
          boughtin_form.helper = FormHelper(boughtin_form)
          boughtin_form.helper.form_action = reverse('edit_product', kwargs={'bought_in_control_panel_id': bought_in_control_panel_id,
                                                                             'item_uuid': item_uuid})
          boughtin_form.helper.add_input(Submit('submit', 'Submit'))
          layout_from_form(boughtin_form)
      return render_to_response('suppliers/products/edit_product.html', {'item': item,
                                                                         'boughtin_form': boughtin_form,
                                                                         'bought_in_control_panel_id': bought_in_control_panel_id})
  </code></pre>
  
  <p>Example Layout Object:</p>
  
  <pre><code>Layout(
      Div(
          Field('name'),
          Field('type'),
          css_class="row-fluid"
      ),
      Div(
          Field('uuid'),
          Field('dave'),
          css_class="row-fluid"
      ),
      .... Etc ad infinitum ....
  )
  </code></pre>