1

現在、ユーザーが製品を編集できるようにするフォームをレンダリングしようとしていますが、現在、フォームはすべて 1 つの長い列として表示されています。

2 つの列に分割するように要求されましたが、ModelFormを使用して生成されているために問題が発生しています。modelform_factory()

2 つのフォーム オブジェクトごとに新しい div を挿入できるクリスピー レイアウト オブジェクトを生成する方法はありますか?

注: 用紙の長さは事前にわかりません。

コードを表示:

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 > 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})

レイアウト オブジェクトの例:

Layout(
    Div(
        Field('name'),
        Field('type'),
        css_class="row-fluid"
    ),
    Div(
        Field('uuid'),
        Field('dave'),
        css_class="row-fluid"
    ),
    .... Etc ad infinitum ....
)
4

1 に答える 1