Linux版FF 92.0下Django 3.2 inline forms缓存问题如何解决?
问题触发原因
这是火狐浏览器内置的**表单状态自动保留+往返缓存(bfcache)**机制导致的:
- 火狐执行软刷新(F5)时,默认会保留用户此前修改过的所有表单控件值(包括你动态修改的隐藏输入框
TOTAL_FORMS),不会直接采用服务器返回的HTML中的默认值 - 硬刷新(Ctrl+Shift+R)会跳过所有本地缓存、强制拉取服务器的完整资源重新渲染,因此值是正确的
- Chrome的表单状态恢复逻辑对动态修改的隐藏输入框处理规则不同,因此不会触发该问题
- 该行为和Linux发行版无关,全平台火狐都默认开启该机制,只是你刚好在Linux环境下测试到而已
可行解决方案
两种方案都可以解决,且不需要修改用户行为或浏览器配置:
方案1:页面加载完成后强制同步TOTAL_FORMS和实际表单项数量(最推荐)
页面加载完成后直接统计实际渲染的inline表单项数量,直接覆盖TOTAL_FORMS的值,无视浏览器的自动回填结果,代码示例:
// 页面DOM加载完成后执行 $(function() { // 统计details_form下实际的表单项行数 const realFormCount = $('#details_form > tr').length; // 强制覆盖TOTAL_FORMS的值 $('#id_details-TOTAL_FORMS').val(realFormCount); });
这个方案兼容性最强,即使后续浏览器的表单回填逻辑变化也不受影响。
方案2:给management_form的隐藏字段添加autocomplete="off"属性
Django默认渲染的formset.management_form没有禁用自动填充,你可以手动渲染管理表单的字段,主动添加禁用自动填充的属性,让浏览器不要保留该字段的历史值:
<!-- 替换原来的 {{ formset.management_form }} --> {% for field in formset.management_form %} <input type="hidden" name="{{ field.name }}" id="{{ field.id_for_label }}" value="{{ field.value|default_if_none:'' }}" autocomplete="off" > {% endfor %}
内容的提问来源于stack exchange,提问作者logicOnAbstractions
相关产品推荐
相关产品推荐

