2011-12-29 25 views
0

我需要在django admin中爲給定的數據庫表分組列。我將採取具有列ID,名字,姓氏,地址1,地址2,地址3的樣本表'學生'。所以分組將是這樣的:Django - django管理部分中的分組列

ID - > ID

名 - >名字,姓氏

地址 - >地址1,地址,地址3

這樣做的目的是獲取標籤集當我查看錶中的數據行時,會出現一些列。所以,當我爲您在Django管理部分提取用於學生表中的行,我應該看到這樣的事情:

--------------------------------------------------------------------------------- 
| ID | NAME     | ADDRESS          | 
--------------------------------------------------------------------------------- 
| ID | First Name | Last Name | Address 1  | Address 2  | Address 3 | 
--------------------------------------------------------------------------------- 
| 1 | Ron  | DCunha | 1st Cross  | Valencia  | Mangalore | 
--------------------------------------------------------------------------------| 
| 2 | Akash  | Attavar | Mark Street  | Attavar   | Mangalore | 
---------------------------------------------------------------------------------

我必須能夠在admins.py實現這一目標(通過編寫擴展admin.ModelAdmin類)使用list_display元組我可以列出我想要查看的列。但我不知道如何分組列。請幫我...

回答

1

要做到這一點,你只需創建一個返回所需的適當的顯示你的模型或的ModelAdmin的方法,然後在您的list_display(它需要的字段名稱使用該方法名可調用)。

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    list_display = ('id', 'full_name') 

    ... 

    def full_name(self, obj): 
     return u'%s %s' % (obj.first_name, obj.last_name) 

或在您的Model(如果顯示在其他情況下比管理員有用的更好,否則使用ModelAdmin):

class MyModel(models.Model): 
    ... 
    def get_full_name(self): 
     return u'%s %s' % (self.first_name, self.last_name) 

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    list_display = ('id', 'get_full_name') 

如果你希望它是訂購的,你需要定義admin_order_field在方法,但你必須選擇一個字段中使用的順序:

def full_name(self, obj): 
    return u'%s %s' % (obj.first_name, obj.last_name) 
full_name.admin_order_field = 'last_name' 

如果您需要包括HTML,指定allow_tags=True上的方法:

def full_name(self, obj): 
    return u'%s %s' % (obj.first_name, obj.last_name) 
full_name.allow_tags = True 

最後,Django會自動從方法名稱組成標籤;在這種情況下,它最終會成爲「全名」。如果你想要一些不同的東西,你可以使用short_description

def full_name(self, obj): 
    return u'%s %s' % (obj.first_name, obj.last_name) 
full_name.short_description = "User's Full Name" 
+0

你解釋的方式非常好。榮譽您的簡潔的解釋。它看起來像一個很好的解決方案,但它會創建一個新的單列,其中的值從不同的列合併而來。但我只想要一個標籤,它將放置在一些個人擁有自己標籤的列上。如果您使用普通模板,這很容易實現。但我想要實現這個Django的管理部分本身。 – 2011-12-29 18:13:59

+0

這不可能通過管理員提供的任何方式來管理contrib包。你也許可以用一些嚴肅的修改模板來修補一個解決方案,並且可能還有一些查看代碼,但這比它的價值更麻煩。 – 2011-12-29 19:29:18

+0

您的解決方案是解決此問題的最佳解決方案。感謝您的回答。我將在需要時將此解決方案用於未來的項目。 – 2011-12-30 06:02:49

0

目前還沒有辦法來爲列在您在管理員列表視圖描述的確切方式。

您的替代方案實現了幾乎相同的結果是Chris Pratt給您的答案。

+0

我想知道是否有方法來顯示我問的方式。我能想到的其他方式是使用jQuery/Javascript進行DOM操作。但架構更改時將難以管理。 – 2011-12-29 18:22:37

+0

感謝您的答覆bro ...你是對的。 :) – 2011-12-30 06:03:42