如何根据名称而不是索引来订购选择?

时间:2011-03-24 10:55:27

标签: python django django-admin

这是我关于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 个答案:

答案 0 :(得分:3)

稍微简洁的表示法:

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

答案 1 :(得分:3)

将表单字段的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

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

class YourAdmin(admin.ModelAdmin):
    form = YourAdminForm

admin.site.register(Your, YourAdmin)
相关问题