Django表单保存时隐藏字段is_ignore_validations值变为False问题及实践咨询
问题解答
问题1:保证is_ignore_validations字段不被本次提交修改
首先你当前代码存在一个明显错误:is_ignore_validations字段的定义写在了表单Meta类内部,Django不会将这个配置识别为表单字段,你设置的HiddenInput和required=False属性完全不会生效。
针对你的需求,有两种可选择的解法:
- 最优解法:直接把
is_ignore_validations从Meta.fields中移除。Django的ModelForm只会更新fields中声明的字段,移除后表单提交完全不会触碰该字段的数据库原有值,完全符合你的需求。 - 如果你确实需要在表单中保留该字段,可以在表单的
clean方法中强制将该字段的值还原为初始值,代码如下:
def clean(self): cleaned_data = super().clean() # 强制用数据库初始值覆盖提交上来的值 cleaned_data['is_ignore_validations'] = self.initial.get('is_ignore_validations') return cleaned_data
也可以在保存时手动处理:
if form.is_valid(): person = form.save(commit=False) # 手动还原为数据库原有值 person.is_ignore_validations = form.instance.is_ignore_validations person.save()
问题2:clean_name中获取值的写法是否为最佳实践
你用self.initial.get('is_ignore_validations')的写法可以正常工作,但不是最优选择:
- 如果你是要取数据库中存储的原有值,更稳妥直观的写法是直接访问绑定的模型实例:
self.instance.is_ignore_validations,这个值直接关联数据库里的记录,不会因为表单初始化参数的问题出现偏差。 - 另外你当前的
clean_name写法有两处可优化的点:- 方法缺少
self参数,正确的声明是def clean_name(self): - 尽量不要直接取
self.data里的原始值,优先取self.cleaned_data.get('name'),这里的值是已经经过字段基础校验的合法值。
- 方法缺少
内容的提问来源于stack exchange,提问作者Kallie
相关产品推荐
相关产品推荐

