我一直在努力处理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
中的选择字段有同样的问题我已经订购了我的选择但是如何在表单中获得有序的选择列表?
答案 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
中,因为我们在此处对表进行了浅层复制。