我正在寻求创建一些内容,如在 django-crispy-forms 中显示多个行和列中所述
我有动态数量的字段,这些字段在运行时通过构造函数的参数添加到表单中。像这样:
class AddRecordForm(forms.Form):
def __init__(self, *args, **kwargs):
extra = kwargs.pop('extra')
super(AddRecordForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.layout = Layout(extra)
self.helper.add_input(Submit('submit','Submit'))
for i, field in enumerate(extra):
self.fields[field] = forms.CharField()
结合我的观点,它使用 ajax 返回呈现的响应,事情似乎很好:
form = AddRecordForm(extra=columns) #columns is a list of field names I want included in the form
context = Context( {'form' : form, 'template' : template } )
form.helper[:len(columns)].wrap(Field, css_class="span6")
#the above call works fine and wraps each field as expected
#form.helper[:len(columns)/2].wrap_together(Div, css_class="row-fluid")
#form.helper[len(columns)/2:].wrap_together(Div, css_class="row-fluid")
#print len(form.helper) => 1?
#form.helper[0][:len(columns)/2].wrap_together(Div, css_class="row-fluid")
template_string = """{% load crispy_forms_tags %} {% crispy form form.helper %}"""
t = Template(template_string)
return HttpResponse(t.render(context))
当我尝试将前半部分字段和后半部分字段打包在一起时,就会出现问题。编译器说:
list indices must be integers, not NoneType
好的?所以然后我尝试四处寻找,然后打印 len(form.helper),然后输出 1。嗯?不管怎么说,调用第一个寻址索引 0 也不起作用,编译器抱怨属性getitem不存在。
是什么赋予了?我以为我在这个用例上几乎完全按照 [文档] [1] 进行操作。
编辑#1:好的,这里的拼接有点奇怪。如果我调整调用中的索引以将前半部分包装为这样读取
half = len(columns)/2
form.helper[0:half].wrap_together(Div, css_class="row-fluid")
这会导致所有字段都被包装。不知道为什么它不尊重索引末端拼接。