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
相关产品推荐
相关产品推荐

