2011-03-24 94 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

相關問題