Django 模型选择列表

django models choices list

我使用的是 django 1.7.2,我得到了一些用于将选项列表放置在模型中的代码。

代码如下:

YOB_TYPES = Choices(*(
    ((0, 'select_yob', _(' Select Year of Birth')),
     (2000, 'to_present', _('2000 to Present'))) +
    tuple((i, str(i)) for i in xrange(1990, 2000)) +
    (1, 'unspecified', _('Prefer not to answer')))
)
....
year_of_birth_type = models.PositiveIntegerField(choices=YOB_TYPES, default=YOB_TYPES.select_yob, validators=[MinValueValidator(1)])
....

上面的代码给出了不正确的 select 列表,如下所示。我已经阅读了几篇 SO 帖子和 google 搜索并搜索了文档,但我被卡住了,我在原地转圈。

这是当前代码显示 select 列表的方式,这是错误的:

但是,我希望 select 列表显示如下:

您应该将最后一个元组包装在另一个元组中:

YOB_TYPES = Choices(*(
    ((0, 'select_yob', _(' Select Year of Birth')),
     (2000, 'to_present', _('2000 to Present'))) +
    tuple((i, str(i)) for i in xrange(1990, 2000)) +
    ((1, 'unspecified', _('Prefer not to answer')),))
)

1) 添加元组时必须小心 - 您需要在末尾设置逗号,以便 python 将其解释为元组:

YOB_TYPES = Choices(*(
    ((0, 'select_yob', _(' Select Year of Birth')),
     (2000, 'to_present', _('2000 to Present'))) +
    tuple((i, str(i)) for i in xrange(1990, 2000)) +
    ((1, 'unspecified', _('Prefer not to answer')),))
)

2) 您必须根据您希望它们出现在列表中的顺序对您的选择进行排序 - 因此“2000 年至今”应该向后移动一位。

3) 使用 empty_label 属性更有意义 - 并删除您选择的第一项:

empty_label="(Select Year fo Birth)"