Django订单选择字段

时间:2018-05-21 13:33:35

标签: django django-forms choicefield

我一直在努力处理Django选择领域的形式。我在forms.py和无线电选择字段中有选择。

DURATION_CHOICES = {
    (1, '30'),
    (2, '45'),
    (3, '60'),
    (4, '75'),
    (5, '90'),
    (6, '105'),
    (7, '120+'),
}

duration = forms.ChoiceField(choices=DURATION_CHOICES, widget=forms.widgets.RadioSelect, label_suffix="", label="Trainingsdauer in Minuten",)

然而,当我打开表单创建一个新的训练课程时,持续时间无线电选择字段是随机排序的,即105在45之前的列表中。顺序甚至从测试设备变为另一个

我对models.py

中的选择字段有同样的问题

我已经订购了我的选择但是如何在表单中获得有序的选择列表?

1 个答案:

答案 0 :(得分:3)

我认为这对您使用的集合来说更成问题。您在此处使用曲线引号({}。这是 set 。设置一个无序 hashable 元素的 hashable 元素集合,这些元素一次或多次出现。但正如所说,该集合是无序的。这意味着如果您按照将要检索它的顺序枚举集合,则无法保证。

使用列表或元组

我认为您最好在这里使用 list tuple ,这是订购的集合元素。对于列表,您可以使用方括号([]),对于元组,使用圆括号(()):

DURATION_CHOICES = [
    (1, '30'),
    (2, '45'),
    (3, '60'),
    (4, '75'),
    (5, '90'),
    (6, '105'),
    (7, '120+'),
]

在将集合作为参数传递之前对集合进行排序

如果您想继续使用该集合,我们可以在将其添加到字段之前将其转换为列表。例如,我们可以使用sorted(..)根据元组的第一项对其进行排序:

from operator import itemgetter

duration = forms.ChoiceField(
    choices=sorted(DURATION_CHOICES, key=itemgetter(0)),
    widget=forms.widgets.RadioSelect,
    label="Trainingsdauer in Minuten",
)

但是请注意,如果您对DURATION_CHOICES集进行了更改,那些更改将 反映在ChoiceField中,因为我们在此处对表进行了浅层复制。