由二项元组构成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。
这是一个关于 choices 列表的例子:
YEAR_IN_SCHOOL_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), ('GR', 'Graduate'), )
每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。 在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如:
from django.db import models class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L") >>> p.save() >>> p.shirt_size 'L' >>> p.get_shirt_size_display() 'Large'
文档出处:http://doc.codingdict.com/django/topics/db/models.html
源码位置:Lib\site-packages\django\db\models\base.py
源码方法:
class Model(six.with_metaclass(ModelBase)):
# ....
def _get_FIELD_display(self, field):
value = getattr(self, field.attname)
return force_text(dict(field.flatchoices).get(value, value), strings_only=True)
模板里获取 choice 显示的值:
{{ get_shirt_size_display }}
view 里获取 choice 显示的值:
class UserProfile(AbstractUser):
"""
用户
"""
gender_choice = (
("0", "女"),
("1", "男"),
)
email = models.EmailField(verbose_name='邮箱', max_length=255, unique=True)
phone = models.CharField(verbose_name="手机号码", max_length=50, unique=True, null=True, blank=True)
avatar = models.URLField(verbose_name="用户头像", default="http://photo.python3.top/avatar_default.png")
gender = models.CharField(max_length=32, choices=gender_choice, default="1", verbose_name="性别")
def get_users(request):
result = []
values_list = ['username', 'gender']
for p in User.objects.all().values_list(*values_list):
print(p)
choice = {k: v for k, v in User.gender_choice}[p[-1]]
print(choice)
# result.append(list(p[:-1]) + [choice])
result.append({values_list[0]: p[0], values_list[1]: choice})
res = {"users": result}
print(res)
return JsonResponse(res)
[13/May/2020 16:11:22 - 192.168.91.116] "GET / HTTP/1.1" 404 3447
[13/May/2020 16:11:26 - 192.168.91.116] "GET /favicon.ico HTTP/1.1" 301 0
[13/May/2020 16:11:26 - 192.168.91.116] "GET /static/images/favicon.ico HTTP/1.1" 200 1150
('yinzhuoqun', '1')
男
('demo', '1')
男
{'users': [{'username': 'yinzhuoqun', 'gender': '男'}, {'username': 'demo', 'gender': '男'}]}
[13/May/2020 16:11:35 - 192.168.91.116] "GET /bus/get_users HTTP/1.1" 200 101