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.
领取专属 10元无门槛券
私享最新 技术干货