新闻中心

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

2025-10-19
浏览次数:
返回列表

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() 方法:

AI Surge Cloud AI Surge Cloud

低代码数据分析平台,帮助企业快速交付深度数据

AI Surge Cloud 87 查看详情 AI Surge Cloud

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 显示对应文本而非存储值的详细内容,更多请关注其它相关文章!


# 都是  # 温江区网站网络推广方案  # 汶上seo优化排名定制  # 上海园林建设招聘网站  # 知乎营销推广费用  # 重庆seo教程公司  # 机器人网站建设企业  # 荷塘区电商营销推广中心  # 网红的推广网站大全最新  # 榆林矩阵seo哪个专业  # 通信网站推广哪家好  # 字段名  # 是一个  # html  # 显示效果  # 使用这个  # 如何在  # 你可以  # 而非  # 数据库中  # 而不是  # django  # app  # cad  # go  # 前端 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: J*a应用程序首次运行自动创建文件与目录的最佳实践  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  Python Socket多播通信中指定源IP地址的实践指南  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  J*aScript数据结构转换:将对象数组按类别分组  zookeeper 都有哪些功能?  2026春节假期时间安排 2026春节假日查询  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  J*aScript中安全有效地处理localStorage字符串数据  VS Code远程开发时如何处理文件权限问题  mcjs网页版在线存档 mcjs云存档登录入口  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  圆通快递查询实时追踪 圆通物流包裹状态快速查看  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  J*a实现学校排课程序_面向对象结构化项目示例  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  Mac怎么查看崩溃日志_Mac控制台错误报告分析  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  服务端验证_j*ascript输入检查  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  CSS Box Model与弹性按钮:维持布局稳定的动画实践  抖音创作助手登录入口_抖音创作辅助工具官网直达  深入理解Promise链:如何在catch后中断then的执行  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  J*aScriptWebpack优化_J*aScript构建工具实战  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  微信客户端如何收红包_微信客户端接收红包使用教程  163邮箱登录密码 163邮箱忘记密码找回  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  Log4j Console Appender性能瓶颈与高并发优化策略 

搜索