You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django表单及模型ChoiceField选项随机排序,如何固定显示顺序?

解决Django ChoiceField选项随机排序的问题

这个问题我之前也碰到过,根源出在你用**字典{}**来定义DURATION_CHOICES选项集合上!

问题原因

Python的字典在3.7版本之前是完全不保证插入顺序的,就算是3.7+的版本虽然支持插入有序,但Django在处理ChoiceField的choices参数时,并不会依赖字典的顺序特性。这就导致了每次渲染表单时,选项的遍历顺序是随机的,不同设备上的排序自然也会不一样——模型里的ChoiceField同理,因为本质上是同一个问题。

解决方案

把DURATION_CHOICES改成元组的元组(或者列表的元组),直接固定选项的顺序:

# 替换原来的字典定义,改成元组的元组
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",
)

原理说明

Django的ChoiceField要求choices参数是一个有序的可迭代序列(比如元组或列表),序列中每个元素是(value, display_name)的二元组,序列的顺序就是表单中选项显示的顺序。用元组的元组定义后,选项会严格按照你编写的顺序渲染,不会再出现随机排序的情况。

如果你的models.py里的ChoiceField也用了字典定义的选项,同样把它改成元组的元组格式,就能解决模型层面的排序问题了。

内容的提问来源于stack exchange,提问作者Matthias Hügli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:26:31