如何在未启用can_order的Django formset中获取未删除表单?
解决Django Formset未开启can_order时获取未删除表单的问题
嗨,这个问题我之前也纠结过!确实有点反直觉——Django给开启了can_order的formset提供了ordered_forms,给开启can_delete的提供了deleted_forms,但偏偏没有一个直接的公开方法来获取未删除的表单列表,这点挺让人困惑的。
先说说你当前的方案:
你用的[form for form in formset.forms if not formset._should_delete_form(form)]虽然用到了下划线开头的“私有”方法,但其实这个方法在Django的formset实现里是相当稳定的——它内部会统一处理表单是否被标记为删除的逻辑(不管表单有没有被clean过,都会检查data或者cleaned_data里的DELETE字段),所以实际用起来是靠谱的。
如果实在不想依赖私有方法,也可以自己实现类似的逻辑:
- 如果formset已经执行过
clean()方法,可以直接检查cleaned_data:[form for form in formset.forms if not form.cleaned_data.get('DELETE', False)] - 如果还没clean,就需要从表单的原始数据里取,注意要加上formset的前缀:
[form for form in formset.forms if not form.data.get(f"{formset.prefix}-{form.prefix}-DELETE", False)]
不过这两种方法都不如直接用_should_delete_form简洁,毕竟它已经帮你封装了这些细节。
总的来说,虽然没有官方公开的内置方法,但你当前的方案是最简便且实用的,不用担心太多——Django很少会改动这类核心内部方法,只要你不是用特别老旧或者超前的版本,都能稳定运行。
内容的提问来源于stack exchange,提问作者Tim Tisdall
相关产品推荐
相关产品推荐

