如何在Django ModelForm的clean方法中正确获取UUID字段值
问题原因
核心问题是unique_identifier字段配置了editable=False,Django的ModelForm默认不会将editable=False的字段纳入表单字段范围,因此cleaned_data中不会包含该字段的值,调用.get()自然返回None。
另外原有代码中super()传入的类名和当前Form类名不匹配,也会导致父类clean方法执行异常。
解决方法
场景1:仅需获取数据库中存储的当前记录UUID(推荐)
更新场景下ModelForm会绑定待修改的数据库实例,直接通过self.instance属性读取字段值即可,不需要从用户提交的表单数据中获取:
import uuid from django import forms from .models import Model class FORM(forms.ModelForm): class Meta: model = Model # 此处填写你需要用户编辑的其他字段即可 fields = ["field1", "field2"] def clean(self): cleaned_data = super().clean() # 直接读取绑定实例的UUID值,对应数据库中已存储的有效值 unique_identifier = self.instance.unique_identifier print(unique_identifier) # 后续可正常执行比对逻辑 return cleaned_data
场景2:需要从表单提交数据中获取UUID
如果逻辑需要读取前端传递的UUID值,可以显式在Form中声明该字段,覆盖editable=False的默认限制,可搭配HiddenInput控件避免用户修改:
import uuid from django import forms from .models import Model class FORM(forms.ModelForm): # 显式声明UUID字段,用HiddenInput隐藏不展示给用户 unique_identifier = forms.UUIDField(widget=forms.HiddenInput) class Meta: model = Model # 必须将unique_identifier加入字段列表 fields = ["unique_identifier", "field1", "field2"] def clean(self): cleaned_data = super().clean() unique_identifier = cleaned_data.get("unique_identifier") print(unique_identifier) return cleaned_data
内容的提问来源于stack exchange,提问作者Steve Smith
相关产品推荐
相关产品推荐

