Django 以迭代方式构建清晰的表单布局?
我目前正在尝试呈现一个允许用户编辑产品的表单,目前该表单全部显示为一个长列 有人要求我将其分为两列,但由于使用Django 以迭代方式构建清晰的表单布局?,django,django-crispy-forms,Django,Django Crispy Forms,我目前正在尝试呈现一个允许用户编辑产品的表单,目前该表单全部显示为一个长列 有人要求我将其分为两列,但由于使用ModelForm\u factory() 是否有任何方法可以生成一个crispylayout对象,它可以每隔两个表单对象插入一个新div 注:表格的长度事先不知道 查看代码: def layout_from_form(form, columns=2): field_count = sum(1 for i in form) # form specified it's itera
ModelForm\u factory()
是否有任何方法可以生成一个crispylayout对象,它可以每隔两个表单对象插入一个新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 ....
)
在您的问题中:“注意:表单的长度事先不知道。”
我们确实可以事先找到表格的长度:
>>> import apps.students.models as models
>>> from django.forms.models import modelform_factory
>>> form = modelform_factory(models.StudentProfileBasics)
>>> len(form.base_fields.keys())
5
从这里开始,a)Crispy通过抓取布局的片段来进行编辑的能力,b)Crispy提供的方法,以及c)forms.Form.base_fields.keys()提供的列表的组合应该可以让您达到您需要的位置
在您的问题中:“注意:表单的长度事先不知道。”
我们确实可以事先找到表格的长度:
>>> import apps.students.models as models
>>> from django.forms.models import modelform_factory
>>> form = modelform_factory(models.StudentProfileBasics)
>>> len(form.base_fields.keys())
5
从这里开始,a)Crispy通过抓取布局的片段来进行编辑的能力,b)Crispy提供的方法,以及c)forms.Form.base_fields.keys()提供的列表的组合应该可以让您达到您需要的位置 表单的长度在哪些方面是事先不知道的?您是否看到过crispy表单文档中的“动态更新布局”:特别是,该操作可能正是您想要的。感觉上你可以在视图中确定传入表单(长度可变)的长度,并以这种方式创建动态布局。我不知道如何获得modelform_factory生成的表单上的字段数,我不能依赖每次都传递相同的模型,有一种方法可以确定使用modelform_工厂生成的对象的长度。看看我刚刚创建的这个粘贴库:也许你从一个空表单类开始,它在
\uuuu init\uuuu
中构造一个FormHelper()类,然后根据Crispy docs动态添加字段。当您在form.base_fields.keys()中迭代字段时,您的逻辑可以确定何时放入Div、Field等类。对我来说,这感觉像是脆表单的一个极好的用例。想法?表单的长度在哪方面是事先不知道的?您是否看到过crispy表单文档中的“动态更新布局”:特别是,该操作可能正是您想要的。感觉上你可以在视图中确定传入表单(长度可变)的长度,并以这种方式创建动态布局。我不知道如何获得modelform_factory生成的表单上的字段数,我不能依赖每次都传递相同的模型,有一种方法可以确定使用modelform_工厂生成的对象的长度。看看我刚刚创建的这个粘贴库:也许你从一个空表单类开始,它在\uuuu init\uuuu
中构造一个FormHelper()类,然后根据Crispy docs动态添加字段。当您在form.base_fields.keys()中迭代字段时,您的逻辑可以确定何时放入Div、Field等类。对我来说,这感觉像是脆表单的一个极好的用例。思想?