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
相关产品推荐
相关产品推荐

