You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:18:35