Django:如何在构建完表单集后添加额外的表单?
Django:如何在构建完表单集后添加额外的表单?
这大致是我想要做的:\n
def post(request): VehicleFormSet = formset_factory(StaffVehicleForm) if request.method == 'POST': vehicle_formset = VehicleFormSet(request.POST) if 'add_vehicle' in request.POST: if vehicle_formset.is_valid(): form_count = vehicle_formset.total_form_count() vehicle_formset.forms.append(vehicle_formset._construct_form(form_count))
\n基本上,如果用户点击“添加”按钮并且他们的输入有效,我想要添加另一个空白表单到表单集中,并隐藏前一个表单。\n上述代码的问题在于,我无法弄清楚如何增加`total_form_count()`的值。现在的方式是,它只会起作用一次,然后再次点击按钮时,什么也不会发生,可能是因为`form_count`是相同的。我也不喜欢调用`_construct_form`并依赖内部机制。
问题的原因:用户想要在已经构建的formset中添加一个额外的表单。
解决方法:通过检查POST数据并进行适当的调整,就好像JS在客户端进行了一些工作一样。下面的代码片段确保formset的末尾始终有至少一个空表单。在处理POST数据之前,首先检查是否有多余的空表单,如果没有,则告诉它我们希望添加一个额外的表单。然后继续对formset进行常规处理。
代码如下:
def hsview(request): HS_formset = formset_factory(HSTestForm, extra=3) prefix = 'XYZZY' testinpost, empty = 'key', '' # field in the form and its default/empty value extra = 3 if request.method != 'POST': formset = HS_formset(prefix=prefix) else: data = {k: v for k, v in request.POST.items() if k.startswith(prefix)} try: n = int(data[prefix + '-TOTAL_FORMS']) test = '{}-{}-{}'.format(prefix, n-1, testinpost) test = data.get(test, empty) except Exception: test = 'bleagh' if test != empty: data[prefix + '-TOTAL_FORMS'] = n + 1 formset = HS_formset(data, prefix=prefix) if formset.is_valid(): ...
这种方法可以在不使用JS或与JS并用的情况下工作,并且不需要了解formset的详细方法。通过检查和调整POST数据,可以实现在已构建的formset中添加额外的表单的功能。
问题的原因是作者想要在已经构建好的formset中添加一个额外的表单,但是不清楚如何调用相应的方法以及获取所需的变量,特别是TOTAL_FORM_COUNT。
解决方法是作者创建了一个名为RequiredFormSet的自定义表单集类,通过重写add_form方法和add_fields方法来实现添加额外表单的功能。在add_form方法中,作者首先通过total_form_count方法获取当前表单集中的表单数量,然后通过_append_form方法将新表单添加到表单集中,并将is_bound属性设置为False。接着,作者通过复制data属性的值来使data属性可变,并增加隐藏表单计数的值。在add_fields方法中,作者调用父类的add_fields方法,并将empty_permitted属性设置为False。
解决方法中作者提到有一个.is_bound = False的操作,用于确保初始值不会出错,但作者并不清楚为什么需要这个操作。
最后,读者给出了一些反馈,其中某些情况下.is_bound属性应该始终为False,除非表单绑定到了提交的POST(或get)数据。作者回应说整个表单集都是绑定的,但他不希望尚未添加的空白表单被绑定。
至于如何调用这个方法以及如何获取TOTAL_FORM_COUNT等变量,作者表示不清楚,因为这段代码是他6年前写的,他对此表示了抱歉。
最后,一位读者感谢作者给出了时间提示,因为有时候几行代码可能花费了无尽的时间,这让他很担心。