Django窗体和模型的枚举实现。
dj.choices的Python项目详细描述
分组选项
选项最糟糕的问题之一是它们的可扩展性弱。为了 例如,应用程序定义了一组可能的选择,如下所示:
>>> class License(Choices): ... _ = Choices.Choice ... ... gpl = _("GPL") ... bsd = _("BSD") ... proprietary = _("Proprietary") ... >>> License() [(1, u'GPL'), (2, u'BSD'), (3, u'Proprietary')]
在应用程序上线之前一切都很好,过一段时间开发人员 希望包含lgpl。自然的选择是在gpl 当我们这样做的时候,索引就会中断。另一方面,添加新的 定义末尾的条目看起来很难看,并使结果组合 用户界面中的框以反直观的方式排序。分组让我们可以解决这个问题 在一类选择中明确定义结构的问题:
>>> class License(Choices): ... _ = Choices.Choice ... ... COPYLEFT = Choices.Group(0) ... gpl = _("GPL") ... ... PUBLIC_DOMAIN = Choices.Group(100) ... bsd = _("BSD") ... ... OSS = Choices.Group(200) ... apache2 = _("Apache 2") ... ... COMMERCIAL = Choices.Group(300) ... proprietary = _("Proprietary") ... >>> License() [(1, u'GPL'), (101, u'BSD'), (201, u'Apache 2'), (301, u'Proprietary')]
这使开发人员能够在以后包含每个组的更多许可证:
>>> class License(Choices): ... _ = Choices.Choice ... ... COPYLEFT = Choices.Group(0) ... gpl_any = _("GPL, any") ... gpl2 = _("GPL 2") ... gpl3 = _("GPL 3") ... lgpl = _("LGPL") ... agpl = _("Affero GPL") ... ... PUBLIC_DOMAIN = Choices.Group(100) ... bsd = _("BSD") ... public_domain = _("Public domain") ... ... OSS = Choices.Group(200) ... apache2 = _("Apache 2") ... mozilla = _("MPL") ... ... COMMERCIAL = Choices.Group(300) ... proprietary = _("Proprietary") ... >>> License() [(1, u'GPL, any'), (2, u'GPL 2'), (3, u'GPL 3'), (4, u'LGPL'), (5, u'Affero GPL'), (101, u'BSD'), (102, u'Public domain'), (201, u'Apache 2'), (202, u'MPL'), (301, u'Proprietary')]
注意行为:
< Buff行情>- 开发人员重新命名了gpl选项,但其含义和id保持稳定
- bsd、apache和专有选项的id保持不变
- 生成的类是自描述性的、可读的和可扩展的
另外,还可以在需要时使用显式指定的组:
>>> License.COPYLEFT <ChoiceGroup: COPYLEFT (id: 0)> >>> License.gpl2 in License.COPYLEFT.choices True >>> [(c.id, c.desc) for c in License.COPYLEFT.choices] [(1, u'GPL, any'), (2, u'GPL 2'), (3, u'GPL 3'), (4, u'LGPL'), (5, u'Affero GPL')]