Django表单__init__方法中如何获取字段的实际值?
解决Django ModelForm初始化时获取更新前字段值的问题
你当前代码里,self.fields['name']拿到的是字段的定义对象(比如CharField实例),不是实际的字段值;而cleaned_data要等表单执行清理逻辑后才会生成,所以在__init__阶段根本不存在这个属性。
正确的做法是利用ModelForm初始化时传入的instance参数——更新操作时,这个参数就是要修改的模型实例,直接从它身上就能获取原始字段值。另外注意你代码里的小错误:ModelForm内部应该是class Meta而非class Model,这是Django的固定写法。
修改后的代码如下:
class Form_Rol(forms.ModelForm): class Meta: model = My_Model fields = "__all__" def __init__(self, *args, **kwargs): # 先调用父类初始化方法,确保self.instance被正确赋值 super().__init__(*args, **kwargs) # 判断是否为更新操作:instance存在且不是新创建的对象 if self.instance and not self.instance._state.adding: original_name = self.instance.name print(original_name)
说明:
- 调用父类
__init__后,self.instance会被赋值为对应的模型实例:创建新对象时是未保存的空实例,更新时是数据库中已存在的实例。 self.instance._state.adding为False时,代表这是一个要更新的已有对象,此时self.instance.name就是数据库中存储的原始值。
内容的提问来源于stack exchange,提问作者Daniel Acuña
相关产品推荐
相关产品推荐

