如何禁用Django ModelForm字段并防止前端篡改?
在Django ModelForm中设置字段disabled属性的方法
嘿,别着急,这个问题其实挺容易解决的,有两种靠谱的方法,我给你拆解清楚:
方法一:直接在Widget的attrs中添加disabled属性
你之前给widget加readonly的方式完全可以复用,只需要把readonly替换成disabled就行,代码修改后是这样的:
class TestForm(forms.ModelForm): class Meta: model = Test fields = ['date'] widgets = { 'date': forms.TextInput(attrs={'disabled': 'disabled'}) }
不过要注意哦,这种方式只是前端禁用,如果用户通过浏览器调试工具去掉disabled属性,还是能提交修改后的值,后端会接收这个输入,安全性稍弱。
方法二:通过字段定义设置disabled=True(推荐)
这是Django官方推荐的方式,因为disabled是表单字段的原生属性,设置后不仅前端会禁用,后端也会自动忽略这个字段的提交值,从根源上防止篡改。代码可以这么写:
class TestForm(forms.ModelForm): # 显式声明date字段,设置disabled=True,同时保留你需要的widget date = forms.DateField( disabled=True, widget=forms.TextInput(attrs={'readonly': 'readonly'}) ) class Meta: model = Test fields = ['date']
如果不需要自定义widget的话,还可以简化成:
class TestForm(forms.ModelForm): date = forms.DateField(disabled=True) class Meta: model = Test fields = ['date']
这样既满足了禁用需求,又保证了后端的安全性,一举两得~
内容的提问来源于stack exchange,提问作者questnofinterest
相关产品推荐
相关产品推荐

