如何在Django中获取自定义模型字段的人类可读月份名称
解决Django模型月份字段返回数字而非可读名称的问题
嘿,这个问题我之前做Django项目时也碰到过!其实你已经踩对了一半——Admin后台能看到月份名称,说明Django已经帮我们维护好了数字和名称的映射关系,只需要用对方法就行~
最简单的解决方案:修改模型的__str__方法
Django对带有choices参数的字段,会自动生成一个get_<字段名>_display()方法,专门用来获取该字段对应的可读显示值。你只需要把模型里的__str__方法改成下面这样:
from django.utils.dates import MONTHS class Month(models.Model): month = models.IntegerField(choices=MONTHS.items(), blank=True, null=True) def __str__(self): # 用get_month_display()获取可读的月份名称,为空时显示兜底文本 return self.get_month_display() or '未选择月份'
这样当你打印Month实例、在控制台查看对象,或者在其他场景调用它的字符串表示时,就会直接返回January、February这类名称了。如果month字段是null,还会显示“未选择月份”作为兜底,避免返回空字符串。
在其他场景中获取月份名称
- 在视图里:直接调用实例的
get_month_display()方法即可:month_obj = Month.objects.get(id=1) month_name = month_obj.get_month_display() # 返回"January" - 在模板里:不需要加括号,直接用模板变量调用:
{{ month_obj.get_month_display }}
自定义月份名称(可选)
如果你想替换默认的英文月份名称(比如用中文),只需要自己定义一个类似MONTHS的字典,替换字段的choices参数就行:
MY_CUSTOM_MONTHS = { 1: '一月', 2: '二月', 3: '三月', # ... 依次定义剩下的月份 } class Month(models.Model): month = models.IntegerField(choices=MY_CUSTOM_MONTHS.items(), blank=True, null=True) def __str__(self): return self.get_month_display() or '未选择月份'
这样get_month_display()就会返回你自定义的月份名称啦~
内容的提问来源于stack exchange,提问作者Hannan
相关产品推荐
相关产品推荐

