Django formset - 仅在没有初始数据集时显示额外字段?

gar*_*yan 11 django django-forms

我有一个显示多个Formset的页面,每个Formset都有一个前缀.使用formset_factory默认选项创建表单集,包括extra=1.可以使用JavaScript添加或删除行.

如果用户正在添加新数据,则会显示一个空白行.完善.

如果用户已添加数据但表单验证失败,在这种情况下,使用MyFormset(data, prefix='o1-formsetname')等填充POST数据的表单集,只显示他们输入的数据.再次,完美.(o1等等是动态生成的,每个o对应于"选项",并且每个"选项"可以具有多个表单集).

但是,如果用户正在编辑现有数据,则在该情况下,视图使用MyFormset(initial=somedata, prefix='o1-formsetname')where somedata来自数据库中的模型的数据的列表来填充formset ,在此数据之后插入额外的空行.除非用户使用JavaScript明确添加一行,否则我不希望显示空白行.

是否有任何简单的方法可以防止formset在设置初始数据时显示额外的行?我initial在第三个例子中使用的原因是,如果我只是在使用中传递数据,MyFormset(somedata, prefix='o1-formsetname')我必须做一个额外的步骤,将所有数据重新格式化为POSTdata样式的dict,包括每个字段的前缀,例如,o1-formsetname-1-price: x等等,以及计算管理表格数据,这增加了整个并发症的负担.

一种解决方案可能是在将formset发送到模板并手动删除行之前拦截它,但该extra_forms属性似乎不可写,并且设置extra0没有任何区别.我也可以让JavaScript检测这种情况并删除该行.但是我不禁想到我错过了一些明显的东西,因为我想要的行为对我来说似乎是明智的预期行为.

谢谢.

Luk*_*ger 5

使用max_num关键字参数formset_factory:

MyFormset = formset_factory([...], extra=1, max_num=1)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看限制表单的最大数量.

一个障碍:大概你想要能够处理多个空白表格.这不太难; 只需确保您不在max_num POST处理端使用关键字参数.


gar*_*yan 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
Run Code Online (Sandbox Code Playgroud)