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

Django中get_field_display()保存后返回整数而非字符串的问题

问题原因与解决办法

哈哈,这个坑我之前踩过!问题出在你给info.status赋值的是字符串类型的"2",而不是枚举要求的整数类型,这直接导致get_status_display()找不到对应的标签文本,只能返回原始值了。

具体为啥会这样?

Django的IntegerChoices工作逻辑是:根据字段的整数值去匹配对应的标签文本。但request.POST里的所有参数都是字符串类型——你直接把request.POST.get("status_change")返回的"2"(字符串)赋值给了info.status,这时候模型实例的status存的是字符串,不是枚举定义的整数2。get_status_display()找不到对应的枚举项,就只能返回你看到的原始值"2"了。

另外还有个小细节:你写的判断条件if request.POST["status"] == 2:也是有问题的——POST值是字符串,这里用整数2去比较,条件根本不会触发,你之前能走到这一步大概率是测试时的巧合,得改成request.POST["status"] == "2"才行。

怎么修复?

最直接的办法是把POST值转换成整数再赋值:

if request.POST["status"] == "2":
    description = "Status changed from " + info.get_status_display() + " → "
    # 把字符串转成整数后赋值
    info.status = int(request.POST.get("status_change"))
    info.save()
    description = description + info.get_status_display()  # 现在就能拿到"Completed"啦

更严谨的方式是直接用枚举成员赋值,彻底避免类型错误:

# 不需要判断字符串,直接用枚举的常量
info.status = Task.Status.COMPLETED

额外小建议

使用IntegerChoices的时候,尽量直接引用枚举的成员(比如Task.Status.OPEN),别手动写整数或者字符串,这样能从根源上避免类型不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:17:26