Django Model Choice Fields 显示对应文本而非存储值


django model choice fields 显示对应文本而非存储值

本文旨在解决 Django Model 中使用 CharField 配合 choices 选项时,如何在模板中显示易读的文本标签,而不是数据库中存储的简短值的问题。通过使用 Django 提供的 get_FIELD_display() 方法,开发者可以轻松地在视图层展示清晰的用户选项,提升用户体验。

在使用 Django 开发 Web 应用时,经常会遇到需要让用户从预定义选项中选择的情况。Django 的 CharField 配合 choices 选项可以很好地满足这个需求。然而,通常为了节省存储空间,数据库中存储的往往是选项对应的简短代码,而不是完整的文本标签。如何在前端页面上显示这些文本标签,而不是简短的代码呢? Django 提供了一个简单而强大的方法来解决这个问题。

使用 get_FIELD_display() 方法

Django 自动为每个定义了 choices 的字段生成一个 get_FIELD_display() 方法。这个方法可以返回与数据库中存储的值对应的文本标签。其中 FIELD 是你的字段名。

例如,如果你的模型中有一个名为 gender 的字段,定义如下:

class StuData(models.Model):
    # ... 其他字段 ...
    MALE = 'm'
    FEMALE = 'f'
    OTHER = 'x'
    GENUNK = 'u'
    GENDER_SELECTIONS = [
        (MALE,'Male'),
        (FEMALE,'Female'),
        (OTHER,'Non-Binary'),
        (GENUNK,'Unknown'),
    ]
    gender = models.CharField(max_length=1, choices=GENDER_SELECTIONS)
    # ... 其他字段 ...

那么,你就可以在模板中使用 stu.get_gender_display() 来获取 gender 字段对应的文本标签,而不是数据库中存储的 'm'、'f' 等值。

模板中的使用示例

假设你在 views.py 中将 StuData 对象传递到模板中,那么你可以在模板中这样使用:

<table id="studata">
    <tr>
        <th>ID Number</th>
        <th>Entry Date</th>
        <th>Gender</th>
        <th>Race</th>
        <th>Ethnicity</th>
        <th>Count</th>
    </tr>
    {% for stu in studata_list %}
    <tr>
        <td>{{ stu.id_num }}</td>
        <td>{{ stu.entry_date }}</td>
        <td>{{ stu.get_gender_display }}</td>
        <td>{{ stu.get_race_display }}</td>
        <td>{{ stu.get_ethnicity_display }}</td>
        <td>{{ stu.stu_count }}</td>
    </tr>
    {% endfor %}
</table>

在这个例子中,{{ stu.get_gender_display }} 会显示 "Male"、"Female"、"Non-Binary" 或 "Unknown",而不是 'm'、'f'、'x' 或 'u'。 同理, {{ stu.get_race_display }} 和 {{ stu.get_ethnicity_display }} 会显示对应的种族和民族的文本标签。

完整示例

以下是一个完整的示例,展示了如何在 Django 项目中使用 get_FIELD_display() 方法:

SONIFY.io SONIFY.io

设计和开发音频优先的产品和数据驱动的解决方案

SONIFY.io 75 查看详情 SONIFY.io

models.py:

from django.db import models
from django.contrib.auth.models import User

class StuData(models.Model):
    id_num = models.IntegerField(primary_key=True)
    entry_date = models.DateTimeField('Date of Entry')
    MALE = 'm'
    FEMALE = 'f'
    OTHER = 'x'
    GENUNK = 'u'
    GENDER_SELECTIONS = [
        (MALE,'Male'),
        (FEMALE,'Female'),
        (OTHER,'Non-Binary'),
        (GENUNK,'Unknown'),
    ]
    gender = models.CharField(max_length=1, choices=GENDER_SELECTIONS)

    AFR_RACE = 'AA'
    ASI_RACE = 'AS'
    WHI_RACE = 'WH'
    UNK_RACE = 'UN'
    RACE_SELECTIONS = [
        (AFR_RACE, 'African-American'),
        (ASI_RACE, 'Asian/Pacific Islander'),
        (WHI_RACE, 'White'),
        (UNK_RACE, 'Unknown Race'),
    ]
    race = models.CharField(max_length=2, choices=RACE_SELECTIONS)

    HSP = 'HIS'
    NHP = 'NHP'
    UNK = 'UNE'
    ETHNICITY_SELECTIONS = [
        (HSP, 'Hispanic Origin'),
        (NHP, 'Not of Hispanic Origin'),
        (UNK, 'Unknown Ethnicity'),
    ]
    ethnicity = models.CharField(max_length=10, choices=ETHNICITY_SELECTIONS)
    stu_count = models.IntegerField(default=1)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        ordering = ["id_num"]

    def __str__(self):
        return str(self.id_num) # 修改了 __str__ 方法,返回 id_num

views.py:

from django.shortcuts import render
from django.views.generic.list import ListView
from .models import StuData

class StuDataList(ListView):
    model = StuData
    template_name = 'myapp/studata_list.html' # 修正了模板路径
    context_object_name = 'studata_list' # 显式设置 context_object_name
    paginate_by = 25

    def get_queryset(self): # 修正了 ordering 的方式
        return StuData.objects.all().order_by('id_num')

studata_list.html:

{% extends "./base.html" %}
{% block content %}

Most recent entries

<table id="studata"> <tr> <th>ID Number</th> <th>Entry Date</th> <th>Gender</th> <th>Race</th> <th>Ethnicity</th> <th>Count</th> </tr> {% for stu in studata_list %} <tr> <td>{{ stu.id_num }}</td> <td>{{ stu.entry_date }}</td> <td>{{ stu.get_gender_display }}</td> <td>{{ stu.get_race_display }}</td> <td>{{ stu.get_ethnicity_display }}</td> <td>{{ stu.stu_count }}</td> </tr> {% endfor %} </table> {% endblock %}

注意事项:

  • 确保 choices 选项定义正确,每个选项都是一个元组,包含存储值和文本标签。
  • 在模板中使用 get_FIELD_display() 方法时,确保 FIELD 是模型中定义的字段名。
  • 如果你的模型中没有定义 choices 选项,那么 get_FIELD_display() 方法将不存在。

总结:

get_FIELD_display() 是 Django 提供的一个非常方便的方法,用于在模板中显示 CharField 字段的文本标签。通过使用这个方法,你可以轻松地在视图层展示清晰的用户选项,提升用户体验。 记住,正确定义 choices 选项是使用这个方法的前提。

以上就是Django Model Choice Fields 显示对应文本而非存储值的详细内容,更多请关注其它相关文章!


# 前端  # 信阳网站建设方案表格  # 是一个  # 都是  # 文本框  # 使用这个  # 如何在  # 你可以  # 而非  # 表单  # 而不是  # django  # app  # cad  # go  # html  # 数据库中  # bb00seo  # seo术语站点地图  # 朔州关键词排名意义在哪  # 兰州全域营销推广  # 商品推广策划营销方案  # 云南抖音seo排名费用  # 惠州seo公司解答火星  # 大庆seo教程如何营销  # 甘肃seo公司技巧 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 键盘声音异常怎么回事_键盘异响怎么处理  以下哪一个是适应长期护理制度发展而设立的新职业  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  Google Drive API服务器端访问指南:服务账户认证详解  汽水音乐在线入口 汽水音乐网页端官方页面快速打开  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法  mysql怎么查询数据_mysql基础查询语句使用教程  VS Code如何设置默认配置  J*aScript类型数组_TypedArray使用  蜻蜓FM如何设置移动流量播放  《火影忍者:木叶高手》快速升级攻略  荣耀Magic6 Pro拍照成像偏暗_荣耀Magic6 Pro夜景优化  向日葵客户端怎么进行语音通话_向日葵客户端语音通话功能使用方法  B站怎么快速升级 B站用户等级提升攻略【详解】  企查查官网和爱企查 企查查企业查询官网入口  vivo手机视频通话美颜怎么设置_vivo视频通话美颜开启方法  Eclipse开发J*a快速入门  《伊瑟》凶影追缉库卢鲁boss攻略  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  Python实战:高效处理实时数据流中的最小/最大值  2025SNH48年度青春盛典门票价格及购买方式  宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  路由器DNS怎么设置最快 优化DNS提升上网速度教程  发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?  《杖剑传说》食谱大全  Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践  谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法  OTT月报 | 2025年9月智能电视大数据报告  背部总是隐隐作痛怎么回事 背痛如何改善  如何使用 Optional 类型并满足 Pylint 的类型检查  猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法  mysql中外键约束如何使用_mysql FOREIGN KEY操作  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  《360浏览器》设置摄像头权限方法  Teambition网盘如何共享文件  《环球网校》设置报考省市方法  智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析  如何测试您的网站全球打开速度-网站海外测速工  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  C++ optional用法详解_C++17处理可能为空的返回值 

 2025-10-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.