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

Django自定义表单IntegerField的cleaned_data始终为初始值问题

问题原因

你给year_from和year_through这两个IntegerField设置了disabled=True属性,在Django表单处理逻辑中,disabled字段会被自动忽略提交的值,始终使用字段定义时的initial值填充cleaned_data。哪怕你在POST QueryDict里能看到用户输入的年份,Django也不会将其纳入表单校验和cleaned_data的生成流程。

解决方案

根据你的需求选择对应处理方式:

  1. 允许用户直接编辑年份:直接移除字段定义中的disabled=True参数:
year_from = forms.IntegerField(required=False, min_value=min_year, max_value=current_year, initial=current_year)
year_through = forms.IntegerField(required=False, min_value=min_year, max_value=current_year, initial=current_year)
  1. 前端展示为不可编辑但允许提交值:如果只是想让用户无法在前端手动修改,但保留提交值的能力(比如通过JS动态修改),将disabled=True替换为readonly属性:
year_from = forms.IntegerField(
    required=False, 
    min_value=min_year, 
    max_value=current_year, 
    initial=current_year,
    widget=forms.NumberInput(attrs={'readonly': 'readonly'})
)
year_through = forms.IntegerField(
    required=False, 
    min_value=min_year, 
    max_value=current_year, 
    initial=current_year,
    widget=forms.NumberInput(attrs={'readonly': 'readonly'})
)
  1. 修正表单__init__方法的小问题:你的表单__init__方法调用父类构造时遗漏了**kwargs,虽然不影响当前问题,但建议修正以避免潜在问题:
def __init__(self, *args, **kwargs):
    super(ExportForm, self).__init__(*args, **kwargs)
补充说明
  • HTML中disabled属性的字段不会被浏览器提交,但你这里POST里能看到值,应该是前端通过JavaScript修改了字段的disabled状态,但Django表单的后端校验逻辑依然会遵循字段定义的disabled=True规则,忽略提交值;
  • readonly属性的字段浏览器会正常提交值,只是用户无法在前端手动编辑,适合需要通过JS动态赋值但不让用户手动修改的场景。

内容的提问来源于stack exchange,提问作者skwidbreth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:40:39