2012-01-20 151 views
6

我在django管理員list_display有一個奇怪的問題。每當我將外鍵添加到list_display時,整個更改列表視圖變爲空白,只顯示條目的總數。Django管理員列表顯示+ ForeignKey =空更改列表

models.py:

class Organization(models.Model): 
    org_id = models.AutoField(primary_key=True) 
    org_name = models.CharField(max_length=288) 

    def __unicode__(self): 
     return self.org_name 

    class Meta: 
     db_table = u'organization' 

class Server(models.Model): 
    server_id = models.AutoField(primary_key=True) 
    server_name = models.CharField(max_length=135,verbose_name="Server Name") 
    org = models.ForeignKey(Organization,verbose_name="Organization") 

    def __unicode__(self): 
     return self.server_name 

    class Meta: 
     db_table = u'server' 

admin.py:

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name','org') 
admin.site.register(Server,ServerAdmin) 

現在我期望此代碼,以顯示我的ChangeList View組織名稱,而是我得到這個:

empty changelist :(

如果我在ServerAdminlist_display刪除org,我得到這個:

change list with data :(

我沒有修改模板或重寫任何ModelAdmin方法。我正在使用Mysql(5.1.58)作爲我的數據庫,隨ubuntu 11.10版本庫一起提供。

我會很高興,如果我能爲這個問題得到一個sloution球員。提前致謝。

+0

在'models.py'我看到'TlxServer'和'admin.py'只是'Server'。這是一個錯字嗎? – jcollado

+0

你不需要定義一個AutoField。 Django自動爲每個表創建一個主鍵。 –

+0

@jcollado:這是一個錯字:P它假設是'服務器' – Pannu

回答

7

我第二個斯特凡諾的事實null=True, blank=True是要添加。但是,我認爲您只需將其添加到Organization型號的org_name字段即可。這應該讓你通過。必須這樣做,因爲您已經運行inspectdb來從您的舊數據庫創建模型。並且DB中的organization表可能存儲了空字符串。因此,添加上述內容將允許管理員顯示空白字段/列。

另外,如果您不想像上面那樣對模型定義進行更改,您也可以嘗試使用callbacks

+0

好吧!與另一個模型類似,比如'Organization',''ForeignKey'到'User'。感謝你和'django-debug-toolbar'歸零的'INNER JOINS'導致了整個問題。 'inspectdb'沒有指定'null = True,balnk = True',我太懶惰了)交叉檢查模型和數據庫。謝謝你,我欠你一個解決這個神祕的問題。 – Pannu

+0

隨時Pannu。所有人都在這裏學習,我也從你的問題中學到了東西。 –

1

請參見:https://stackoverflow.com/a/163968/1104941

請問以下爲你工作?

admin.py:

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name','org__org_name') 
admin.site.register(Server,ServerAdmin) 
+0

我嘗試了你的解決方案,雖然聽起來很奇怪,但它似乎並不奏效。它一直彈出一個錯誤''org__org_name'不是一個可調用的或'ServerAdmin'的屬性或在模型'服務器'中找到.'感謝反正男人。 – Pannu

+0

您不能使用跨越list_display中關係的術語,這可能非常有用。解決方法是在ModelAdmin子類中定義一個返回您正在查找的值的方法,並將該方法的名稱添加到list_display中。 – glarrain

2

嘗試增加null=True, blank=True到所有模型字段。

如果行不驗證模型約束,通常django admin會沉默失敗(因此在列表中不顯示任何記錄)。

+0

抱歉的人,Sandeep提煉你的答案。謝謝:) – Pannu

0

我也有類似的問題,解決它像這樣(用你的例子):

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name', 'get_org') 

    def get_org(self, obj): 
     return obj.org.org_name 

    get_org.short_description = 'Org' 

admin.site.register(Server,ServerAdmin) 
相關問題