如何根据名称而非索引排序选择项?
这是我第一次在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)