如何按名称而非索引顺序排序选项?

5

这是我在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)的定义中实现?

谢谢大家。


你确定在更改“STATE”的顺序后重新启动了 Django 进程吗?我无法复制您所描述的行为:当我更改任何选项元组的顺序时,该顺序随后会在管理页面中更改。 - dgel
我将尝试重新启动Django进程。我以为重启Apache和/或删除项目根文件夹下的所有.pyc文件就足以看到我的更改。但似乎不是这样的:在更改后,会发生一些奇怪的事情:我可以通过反复刷新同一页来查看最近的更改历史记录。谢谢。 - paztek
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)

在 self.fields ['field'].choices = sorted_choices 之前添加 sorted_choices = sorted(YourModel.STATE, key=lambda x: x[1])。 - jobima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接