Python 如何根据名称而不是索引排序选项?

Python 如何根据名称而不是索引排序选项?,python,django,django-admin,Python,Django,Django Admin,这是我在stackoverflow上的第一篇文章,我将尝试遵循基本规则,但对我要温柔 我必须对django应用程序进行一些更改(乍一看似乎很肤浅)。 客户端希望站点管理部分中表单的所有下拉菜单按字母顺序排序。问题在于,其中一些选择基于models.py文件中定义的静态列表,如: STATE=( (1, 'Full'), (2, 'Damaged'), (3, 'Partially damaged') ) 我试着像这样重新排列列表: STATE=(

这是我在stackoverflow上的第一篇文章,我将尝试遵循基本规则,但对我要温柔

我必须对django应用程序进行一些更改(乍一看似乎很肤浅)。 客户端希望站点管理部分中表单的所有下拉菜单按字母顺序排序。问题在于,其中一些选择基于models.py文件中定义的静态列表,如:

STATE=(  
    (1, 'Full'),  
    (2, 'Damaged'),  
    (3, 'Partially damaged')  
)  
我试着像这样重新排列列表:

STATE=(  
    (2, 'Damaged'),  
    (1, 'Full'),  
    (3, 'Partially damaged')  
)  
STATE=(  
    (1, 'Damaged'),  
    (2, 'Full'),  
    (3, 'Partially damaged')  
)  
但这似乎没有什么区别(尽管我对Python缓存类和视图的方式不太熟悉)

重新排序索引,如下所示:

STATE=(  
    (2, 'Damaged'),  
    (1, 'Full'),  
    (3, 'Partially damaged')  
)  
STATE=(  
    (1, 'Damaged'),  
    (2, 'Full'),  
    (3, 'Partially damaged')  
)  
但这意味着要编写一些庞大而复杂的SQL脚本来保持旧数据的一致性(因为大多数列表都比这个列表长,排列也会变得更复杂)

所以我的问题是:有没有一种方法可以根据这些选择的名称而不是索引对它们进行排序?可能在
models.IntegerField(…,choices=STATE)
的定义中


谢谢大家。

稍微简洁一点的符号:

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

将表单字段的choices属性更改为排序的选项应该可以解决您的问题

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
以及:


更改
状态的顺序后,是否确保重新启动django进程?我无法复制您描述的行为:当我更改任何选项元组的顺序时,该顺序随后会在admin中更改。我将尝试重新启动django进程。我认为重启Apache和/或删除所有的.pyc文件(在我的项目根文件夹下)就足以看到我的更改。但似乎不是这样:在一次更改之后,一些奇怪的事情发生了:我可以通过一次又一次刷新同一页来查看最近的更改历史。谢谢。在self.fields['field']前面添加排序的选项=排序的(YourModel.STATE,key=lambda x:x[1])。选项=排序的选项