由二项元组构成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了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