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 对象传递到模板中,那么你可以在模板中这样使用:

    {% for stu in studata_list %}        {% endfor %}
ID Number Entry Date Gender Race Ethnicity Count
{{ stu.id_num }} {{ stu.entry_date }} {{ stu.get_gender_display }} {{ stu.get_race_display }} {{ stu.get_ethnicity_display }} {{ stu.stu_count }}

在这个例子中,{{ 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() 方法:

models.py:

from django.db import modelsfrom django.contrib.auth.models import Userclass 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 renderfrom django.views.generic.list import ListViewfrom .models import StuDataclass 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

{% for stu in studata_list %} {% endfor %}
ID Number Entry Date Gender Race Ethnicity Count
{{ stu.id_num }} {{ stu.entry_date }} {{ stu.get_gender_display }} {{ stu.get_race_display }} {{ stu.get_ethnicity_display }} {{ stu.stu_count }}
{% endblock %}

注意事项:

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

总结:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1586210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 02:21:02
下一篇 2025年12月23日 02:21:17

相关推荐

发表回复

登录后才能评论
关注微信