2012-01-20 13 views
6

私はdjango admin 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 :(

私は ServerAdminクラスの list_displayorgを削除した場合

、私はこれを取得:

change list with data :(

私は、テンプレートを変更したり、任意のModelAdminメソッドをオーバーライドしませんでした。私はubuntu 11.10リポジトリに付属のデータベースとしてMySQL(5.1.58)を使用しています。

私はこの問題の男のためにsloutionを得ることができたら本当にうれしいでしょう。前もって感謝します。

+0

models.py' 'で、私は' TlxServer'と 'admin.py'ちょうど' Server'でを参照してください。それはタイプミスですか? – jcollado

+0

AutoFieldを定義する必要はありません。 Djangoはテーブルごとにプライマリキーを自動的に作成します。 –

+0

@jcollado:それはタイプミスです:Pそれは 'サーバー'と思われる – Pannu

答えて

7

I第2のステファノは、null=True, blank=Trueが追加されることになっています。しかし、Organizationモデルのorg_nameフィールドに追加する必要があると思います。それはあなたの方法を行う必要があります。これは、レガシーDBからモデルを作成するためにinspectdbを実行したために実行する必要があります。おそらくDB内のorganizationテーブルには、空の文字列が格納されています。したがって、上記を追加すると管理者は空白のフィールド/列を表示できます。

また、上記のようなモデル定義に変更を加えたくない場合は、callbacksを試してみることもできます。

+0

よろしく! 'User'に' ForeignKey'があった 'Organization'のような別のモデルと同様の状況でした。あなたと 'django-debug-toolbar'の' INNER JOINS'のZero'dが問題を引き起こしてくれてありがとうございます。 'inspectdb'は' null = True、balnk = True'を指定せず、モデルとデータベースをクロスチェックするために怠けです。ありがとう、私はあなたにこの神秘的な探している問題を解決するために1つ借りています。 – 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 'の属性ではなく、モデル' Server'.'に感謝しています。おかげです。 – Pannu

+0

list_displayでリレーションシップをまたぐ用語を使用することはできません。非常に参考になります。回避策は、探している値を返すModelAdminサブクラスにメソッドを定義し、そのメソッドの名前をlist_displayに追加することです。 – glarrain

2

は、すべてのモデルフィールドへnull=True, blank=Trueを追加してみてください。

通常、行がモデル制約を検証しない場合、django管理者は非常に失敗します(したがって、リストにレコードを表示しません)。

+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) 
関連する問題