2011-09-09 22 views
10

我有一个显示多个Formset的页面,每个Formset都有一个前缀。表单集使用默认选项formset_factory创建,包括extra=1。可以使用JavaScript添加或删除行。Django formset - 仅当没有初始数据集时才显示额外字段?

如果用户正在添加新数据,则会出现一个空白行。完善。

如果用户已经添加了数据但表单验证失败,在这种情况下,表单集使用了MyFormset(data, prefix='o1-formsetname')等POST数据,只有他们输入的数据才显示出来。再次,完美。 (o1等动态生成,每个o对应一个“选项”,每个“选项”可能有多个表单集)。

但是,如果用户正在编辑现有的数据,在这种情况下,鉴于填充使用MyFormset(initial=somedata, prefix='o1-formsetname')其中somedata是从数据库中的一个模型来的数据的类型的字典列表中的表单集,一个额外的空白行该数据之后插入。除非用户使用JavaScript明确添加一行,否则不需要显示空白行。

是否有任何简单的方法来防止formset显示额外的行,如果初始数据设置?我在第三个例子中使用initial的原因是,如果我刚刚使用MyFormset(somedata, prefix='o1-formsetname')来传递数据,则必须将所有数据重新格式化为包含每个字段的前缀的POSTdata样式字典,例如o1-formsetname-1-price: x以及计算管理形式的数据,这增加了整个负荷的复杂性。

一种解决方案可能是拦截表单集,然后再将其发送到模板,并手动删除该行,但extra_forms属性似乎没有可写的,并设置extra0没有任何区别。我也可以让JavaScript检测这种情况并删除该行。然而,我不禁想到我错过了一些明显的事情,因为我想要的行为是对我来说似乎是合理的预期行为。

谢谢。

+0

我使用Django 1.1,其中'max_num'参数的行为不同;见下面的回复。 – garybryan

回答

3

我想出了一个适用于Django 1.1的解决方案。我创建了BaseFormSet的子类,它覆盖total_form_count方法,因此如果存在初始表单,则总数不包含额外的表单。也许有点破解,也许有更好的解决方案,我找不到,但它的工作原理。

class SensibleFormset(BaseFormSet): 
    def total_form_count(self): 
     """Returns the total number of forms in this FormSet.""" 
     if self.data or self.files: 
      return self.management_form.cleaned_data[TOTAL_FORM_COUNT] 
     else: 
      if self.initial_form_count() > 0: 
       total_forms = self.initial_form_count() 
      else: 
       total_forms = self.initial_form_count() + self.extra 
      if total_forms > self.max_num > 0: 
       total_forms = self.max_num 
      return total_forms 
+0

我在'CreateView'内手动执行'myFormset.extra = 1',并将'inlineformset_factory constructor'中的值设置为0.认为这是更少的代码(一行)。 –

5

使用max_num关键字参数formset_factory

MyFormset = formset_factory([...], extra=1, max_num=1) 

有关详细信息,请limiting the maximum number of forms

其中一个hitch:大概你想能够进程多个空白表单。这并不难;只要确保不要在POST处理端使用max_num关键字参数。

+0

其实我今天又在看这个问题。此解决方案不能按预期工作:如果有多个初始行,则只显示其中一行,因为max_num会限制它们。 我认为这是因为我在Django 1.1上; 1。1文档说:“formset_factory的max_num参数使您能够强制formset将显示的最大数量的表单”,而1.3文档则说“formset_factory的max_num参数使您能够限制formset的空表单的最大数量将显示“,所以'max_num'的含义已经改变。任何想法1.1? – garybryan

+0

正是需要将表格的数量限制为一个!简单和干净...最佳答案! – AmiNadimi

相关问题