Django订单选择字段

Mat*_*gli 5 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",)
Run Code Online (Sandbox Code Playgroud)

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

我对来自 models.py 的选择字段有同样的问题

我已经订购了我的选择,但如何在我的表格中获得订购的选择列表?

Wil*_*sem 8

我认为这更多是您使用的集合的问题。您在这里使用大引号 ( {})。这是一个set. A 为我们设置了出现零次或一次的可散列元素的无序集合。但如前所述,集合是无序的。这意味着如果您以检索的顺序枚举集合,则无法保证。

使用列表或元组

我认为你最好listtuple这里使用 a或 a ,它们是元素的有序集合。对于列表,您可以使用方括号 ( []),对于元组,您可以使用圆括号 ( ()):

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

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

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

from operator import itemgetter

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

但是请注意,如果您对DURATION_CHOICES集合进行更改,这些更改将不会反映在 中ChoiceField,因为我们在这里对列表进行了浅拷贝。