
在 Django 模型中为字段定义 choices 后,模板中需调用 get_FOO_display() 方法才能显示可读文本,而非数据库存储的缩写值。
在 django 模型中为字段定义 `choices` 后,模板中需调用 `get_foo_display()` 方法才能显示可读文本,而非数据库存储的缩写值。
当你在 Django 模型中为 CharField(或其他字段)设置 choices 参数时,Django 会自动为该字段生成一个辅助方法:get_
在你的 Product 模型中:
class Product(models.Model):
choice = (
('d', 'Dark'),
('s', 'Sweet'),
)
# ... 其他字段
status = models.CharField(max_length=1, choices=choice)
def __str__(self):
return self.get_status_display() # ✅ 正确:返回 'Dark' 或 'Sweet'
✅ 模板中正确写法(推荐):
直接在模板中使用 {{ product.get_status_display }}(注意:不加括号,Django 模板语言会自动调用该方法):
<p>Status: {{ product.get_status_display }}</p>
❌ 错误写法(仅显示缩写):
<p>Status: {{ product.status }}</p> <!-- 输出 'd' 或 's' -->
⚠️ 注意事项:
- get_FOO_display() 是 Django 自动生成的实例方法,仅当字段定义了 choices 且模型已迁移后才可用;
- 在 Python 视图或 shell 中调用时需加括号:product.get_status_display();
- 模板中不可加括号,否则会报错(Django 模板引擎不支持函数调用传参);
- 若字段值不在 choices 中(如数据库存在脏数据 'x'),该方法将返回原始值('x'),不会抛异常;如需严格校验,建议配合 choices + 数据库约束或自定义验证器;
- __str__ 方法中使用 get_status_display() 是良好实践,有助于管理后台、日志和调试输出更友好。
? 扩展提示:你还可以在 Admin 中自动启用下拉选择,并确保表单渲染正确:
# admin.py
from django.contrib import admin
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('title', 'user', 'get_status_display', 'active_bool') # ✅ 支持 display 方法
list_filter = ('status', 'active_bool')
通过正确使用 get_status_display,你既能保持数据库轻量(仅存单字符),又能在前端、管理后台等所有上下文中一致呈现语义化文本。











