回到顶部

Contents

django 获取字段选项 choice 的值

choices

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

 


^_^
请喝咖啡 ×

本作品由 卓越笔记 采用 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 进行许可
前一篇: 使用钉钉自定义机器人(webhook)
下一篇: python pip 常用命令
captcha