2011-03-24 87 views
3

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

谢谢大家。

+0

你确定改变'STATE'顺序后重新启动Django的过程?我无法复制您描述的行为:当我更改任何选择元组的顺序时,该顺序随后会在admin中更改。 – dgel 2011-03-24 11:09:42

+0

我会尝试重新启动django进程。我认为重新启动Apache和/或删除所有.pyc文件(在我的项目根文件夹下)足以能够看到我的更改。 但它似乎不是:改变之后,一些奇怪的事情发生了:我可以一次又一次地刷新同一页面看到最近的变化史。 谢谢。 – paztek 2011-03-30 07:18:09

回答

3

稍微更简洁的符号:表单域的

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

变更选择属性来排序的选择应解决您的问题。

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) 
+0

添加sorted_choices =排序(YourModel.STATE,键=拉姆达X:X [1])。之前self.fields [ '字段']的选择= sorted_choices – jobima 2018-02-23 07:49:59

相关问题