
本文旨在解决 Django Model 中使用 CharField 配合 choices 选项时,如何在模板中显示易读的文本标签,而不是数据库中存储的简短值的问题。通过使用 Django 提供的 get_FIELD_display() 方法,开发者可以轻松地在视图层展示清晰的用户选项,提升用户体验。
在使用 Django 开发 Web 应用时,经常会遇到需要让用户从预定义选项中选择的情况。Django 的 CharField 配合 choices 选项可以很好地满足这个需求。然而,通常为了节省存储空间,数据库中存储的往往是选项对应的简短代码,而不是完整的文本标签。如何在前端页面上显示这些文本标签,而不是简短的代码呢? Django 提供了一个简单而强大的方法来解决这个问题。
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() 方法:
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 %}
<h3>Most recent entries</h3>
<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 %}注意事项:
总结:
get_FIELD_display() 是 Django 提供的一个非常方便的方法,用于在模板中显示 CharField 字段的文本标签。通过使用这个方法,你可以轻松地在视图层展示清晰的用户选项,提升用户体验。 记住,正确定义 choices 选项是使用这个方法的前提。
以上就是Django Model Choice Fields 显示对应文本而非存储值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号