无法用Django中的Crispy表单帮手包裹切片

时间:2013-05-30 08:03:48

标签: python django django-forms django-crispy-forms

我正在寻求创建Displaying multiple Rows and Columns in 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")

这会导致所有字段被包装。不确定为什么它不尊重索引末端拼接。

1 个答案:

答案 0 :(得分:0)

这完全看起来像一个脆皮形式的错误包装,我将在本周末或尽可能早地审查它。