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

问题描述 投票:4回答:2

这是我关于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)的定义?

谢谢你们。

python django django-admin
2个回答
3
投票

稍微简洁的表示法:

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

3
投票

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

forms.朋友

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)
© www.soinside.com 2019 - 2024. All rights reserved.