如何根据名称而非索引排序选择项?

5 投票
2 回答
7145 浏览
提问于 2025-04-16 14:19

这是我第一次在StackOverflow发帖,我会尽量遵循基本规则,但请多多包涵。

我需要对一个Django应用做一些修改,乍一看这些修改似乎很简单。客户希望网站后台的表单下拉菜单里的选项能按字母顺序排列。问题是,这些选项有些是基于在models.py文件中定义的静态列表,比如这个:

STATE=(  
    (1, 'Full'),  
    (2, 'Damaged'),  
    (3, 'Partially damaged')  
)  

我试着这样重新排序列表:

STATE=(  
    (2, 'Damaged'),  
    (1, 'Full'),  
    (3, 'Partially damaged')  
)  

但似乎没有什么变化(虽然我对Python是如何缓存类和视图的还不太熟悉)。

我这样调整索引:

STATE=(  
    (1, 'Damaged'),  
    (2, 'Full'),  
    (3, 'Partially damaged')  
)  

是有效的,但这意味着我需要写一些庞大而复杂的SQL脚本来保持旧数据的一致性(因为大多数列表都比这个长,排列组合会变得更复杂)。

所以我的问题是:有没有办法根据名称而不是索引来排序这些选项?也许在models.IntegerField(..., choices=STATE)的定义中可以实现?

谢谢大家。

2 个回答

4

稍微简洁一点的写法:

sorted_state = sorted(STATE, key=lambda x: x[1])
4

把表单字段的选项属性改成排序后的选项应该能解决你的问题。

这是 forms.py 文件:

class YourAdminForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(YourAdminForm, self).__init__(*args, **kwargs)
        sorted_choices = sorted(YourModel.STATE, key=lambda x: x[1])
        self.fields['field'].choices = sorted_choices

还有:

from django.contrib import admin
from models import Your
from forms import YourAdminForm

class YourAdmin(admin.ModelAdmin):
    form = YourAdminForm

admin.site.register(Your, YourAdmin)

撰写回答