Django ModelForm调用save()时如何将布尔字段从False改为True?
这问题其实挺常见的,有几种简单直接的方式可以实现,我给你列两个最常用的方案:
方法1:用commit=False手动修改实例
调用表单的save()时,传入commit=False参数,会得到一个已经填充了表单数据但还未写入数据库的Survey实例。这时你就能直接修改它的is_published字段,最后再调用实例的save()完成保存:
if form.is_valid(): # 获取未提交到数据库的实例 survey = form.save(commit=False) # 修改发布状态为True survey.is_published = True # 正式保存到数据库 survey.save()
这个方式的好处是灵活,你还能在保存前加一些额外判断,比如根据用户权限决定是否开启发布状态。
方法2:重写ModelForm的save()方法
如果这个“保存时自动设为已发布”的逻辑是固定的,每次用这个表单都要执行,那可以直接在ModelForm里重写save()方法,让它自动处理:
from django.forms import ModelForm from .models import Survey class SurveyForm(ModelForm): class Meta: model = Survey fields = ['你的其他字段', 'is_published'] # 或者用exclude排除不需要的字段 def save(self, commit=True): # 先调用父类的save方法获取实例 instance = super().save(commit=False) # 强制设置发布状态为True instance.is_published = True if commit: instance.save() return instance
之后你只需要正常调用表单的save()就可以了,不用每次都手动修改实例:
if form.is_valid(): form.save()
另外补充一点:如果你的表单没有把is_published展示给用户编辑(也就是Meta里没包含这个字段),上面两种方法依然有效,ModelForm会默认保留模型字段的逻辑,只是不在前端渲染输入框而已。
内容的提问来源于stack exchange,提问作者user1970728
相关产品推荐
相关产品推荐

