享学课堂-django字段选项hoices

choices

Field.choices

它是一个可迭代的结构(比如,列表或是元组),由可迭代的二元组组成(比如[(A, B), (A, B) …]),用来给这个字段提供选择项。如果设置了 choices ,默认表格样式就会显示选择框,而不是标准的文本框,而且这个选择框的选项就是 choices 中的元组。

每个元组中的第一个元素,是存储在数据库中的值;第二个元素是该选项更易理解的描述。 比如:

YEAR_IN_SCHOOL_CHOICES = (

(‘FR’, ‘Freshman’),

(‘SO’, ‘Sophomore’),

(‘JR’, ‘Junior’),

(‘SR’, ‘Senior’),

)

一般来说,最好在模型类内部定义choices,然后再给每个值定义一个合适名字的常量。

from django.db import models

class Student(models.Model):

FRESHMAN = 'FR’

SOPHOMORE = 'SO’

JUNIOR = 'JR’

SENIOR = 'SR’

YEAR_IN_SCHOOL_CHOICES = (

(FRESHMAN, ‘Freshman’),

(SOPHOMORE, ‘Sophomore’),

(JUNIOR, ‘Junior’),

(SENIOR, ‘Senior’),

)

year_in_school = models.CharField(max_length=2,

choices=YEAR_IN_SCHOOL_CHOICES,

default=FRESHMAN)

def is_upperclass(self): return self.year_in_school in (self.JUNIOR, self.SENIOR)

尽管你可以在模型类的外部定义choices然后引用它,但是在模型类中定义choices和其每个choice的name(即元组的第二个元素)可以保存所有使用choices的类的信息, 也使得choices更容易被应用(例如, Student.SOPHOMORE 可以在任何引入Student 模型的位置生效)。

你也可以归类可选的choices到已命名的组中用来达成组织整理的目的:

MEDIA_CHOICES = (

(‘Audio’, (

(‘vinyl’, ‘Vinyl’),

(‘cd’, ‘CD’),

)

),

(‘Video’, (

(‘vhs’, ‘VHS Tape’),

(‘dvd’, ‘DVD’),

)

),

(‘unknown’, ‘Unknown’),

)

每个元组的第一个元素是组的名字。第二个元素是一组可迭代的二元元组,每一个二元元组包含一个值和一个给人看的名字构成一个选项。分组的选项可能会和未分组的选项合在同一个list中。 (就像例中的unknown选项)。

对于有choices set的模型字段, Django 将会加入一个方法来获取当前字段值的易于理解的名称(即元组的第二个值)参见数据库API文档中的get_FOO_display()。

请注意choices可以是任何可迭代的对象 – 不是必须是列表或者元组。这一点使你可以动态的构建choices。但是如果你发现你自己搞不定动态的choices,你最好还是使用ForeignKey来构建一个合适的数据库表。如果有数据变动的话,choices意味着那些变动不多的静态数据。

新的Django 1.7。

除非blank=False 和default一起在字段中被设置,否则,可选择菜单将会有"---------" 的标签。要重写这个行为, 需要加入一个包含None的元组到 choices里面; 例如 (None, ‘Your String For Display’). 或者, 你可以在操作有意义的地方用一个空字符串代替None - 比如在一个 CharField.

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180425A0FVZA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券