使用元组时,ChoiceField 不显示空标签

新手上路,请多包涵

我想做什么

我将在我的数据库中保留有关比赛的数据。我希望能够按特定标准搜索比赛 - 特别是比赛类型。

关于比赛类型

竞争类型保存在一个元组中。一个稍微缩短的例子:

 COMPETITION_TYPE_CHOICES = (
    (1, 'Olympic Games'),
    (2, 'ISU Championships'),
    (3, 'Grand Prix Series'),
)

这些在模型中使用如下(再次 - 这是模型的缩短/简化版本):

 class Competition(models.Model):
    name = models.CharField(max_length=256)
    type = models.IntegerField(choices=COMPETITION_TYPE_CHOICES)

搜索表单

我不希望搜索表单中需要这些字段,因此表单定义如下:

 class CompetitionSearchForm(forms.Form):
    name = forms.CharField(required=False)
    type = forms.ChoiceField(choices=COMPETITION_TYPE_CHOICES,required=False)

问题

我希望 ChoiceField 中的选择小部件显示一个空标签,但我没有得到。对此的任何帮助将不胜感激:)

原文由 Monika Sulik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 405
2 个回答

我找到了一种解决方案,它可以按照我想要的方式工作,而且不会违反 DRY 原则。不是很干净,但我想它必须这样做。

根据 文档 选择不必是元组:

最后,请注意 choices 可以是任何可迭代对象——不一定是列表或元组。这使您可以动态地构建选择。但是,如果您发现自己的黑客选择是动态的,那么您最好使用带有外键的适当数据库表。选择适用于变化不大的静态数据,如果有的话。

所以我现在要使用的解决方案是:

 COMPETITION_TYPE_CHOICES = [
     (1, 'Olympic Games'),
     (2, 'ISU Championships'),
     (3, 'Grand Prix Series'),
]

COMP_TYPE_CHOICES_AND_EMPTY = [('','All')] + COMPETITION_TYPE_CHOICES

然后:

 class CompetitionSearchForm(forms.Form):
    name = forms.CharField(required=False)
    type = forms.ChoiceField(choices=COMP_TYPE_CHOICES_AND_EMPTY, required=False)

该模型保持原样。

原文由 Monika Sulik 发布,翻译遵循 CC BY-SA 2.5 许可协议

我尝试了 Monika 和 Evgeniy 的解决方案但都没有成功,但 Monika 的优点在于选择不需要是元组。因此,最简单(也是 DRYest)的解决方案是简单地执行 Django 已经在模型字段中执行的操作。在将它们转换为列表后,只需将空白选择和元组添加在一起:

 from django.db.models.fields import BLANK_CHOICE_DASH

...

type = forms.ChoiceField(choices=BLANK_CHOICE_DASH + list(COMPETITION_TYPE_CHOICES), required=False)

原文由 Scott 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题