2011-05-11 12 views
0

私はdjango adminを学んでいます。私はそれらの間に一対多の関係でモデル化しなければなりません。 私は、さまざまな自動車メーカーを加えることができるメーカーモデル、車を追加するための車モデルのようなものを手に入れました。私のdjangoの管理ページで、私はmanufacturer1の項目をクリックすると、manufacturer1といっしょにmanfuctredされているすべての車のdisplay_listにできるようにしたい。親モデルの1対多の子の表示リスト

製造元の管理モデルでインラインモデルを使用してトリックを見つけました。問題は、データベース内のすべてのエントリが読み込まれ、大きなテーブルとして時間がかかることです。

これ以外の方法はありますか、新しいテンプレートを作成する必要はありますか?

EDIT: 目標は、あなたがどんなハックを必要としないページ

答えて

1

あなたは2つのオプションがあります。

最も簡単な方法は、逆の関係を調べることです。メーカーの変更フォームに行く代わりに、すべての車を見て。車のチェンジリストに行き、メーカーごとにフィルターをかけます。車のlist_filter属性をメーカーModelAdminに設定する必要があります。

オプション2は、巨大な苦痛になるだろうが、あなたはextra_contextにそのメーカーの車のリストを追加するメーカーModelAdminchange_viewを上書きすることができます。それから、adminテンプレートを 'templates/admin/yourapp/manufacturer/change_form.html'で上書きする必要があります。そのテンプレートに追加して、extra_contextに渡した車のリストを使用して探している種類のリストを作成し、インスピレーションのために 'django/contrib/admin/templates/change_list.html'を描画します。

Django docs on the Adminをよくお読みください。実際にそこには豊富な情報があります。

+0

私はlist_filterのアイデアが好きです! – Chakib

1

に分割結果とDISPLAY_LISTと同じ表示を取得するが、InlineModelAdminと同じようManufacturer1にFKですべての車をロードすることではありません。 DGANGOの管理者は、InlineModelAdminの権利を意図した通りに使用している限り、Manufacturer1を選択するとFKを持つ車のみをManufacturer1に表示します。あなたの更新の質問には

+0

はい、あなたは正しいですが、InlineModelAdminは、メーカー1にFkを持つすべての車を読み込みますが、display_listは巨大なエントリに非常に便利なページに分割します。 – Chakib

1

回答:それを行うには

の方法は、あなたがFordCarGMCar経由Carモデルを拡張し、両方のために、Metaクラスでproxy=Trueを使用ProxyModelsを使用してModelAdmin.queryset

をオーバーライドすることで可能性がありそれら。

FordCarGMCarのそれぞれに別々の管理者を登録し、それらのModelAdminのクエリーセットメソッドをオーバーライドして、それぞれの製造元をフィルタリングすることができます。

例:

class FordCarAdmin(admin.ModelAdmin) 
    list_display = fields = ['name','model','engine'] 

    def queryset(self,request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(manufacturer__name='Ford') 

admin.site.register(FordCar,FordCarAdmin) 
+0

あなたの例のThanxはプロキシモデルについてはわかりませんでした私は各ブランドのModelAdminを作成する必要がある場合、新しいメーカーを動的に作成することはできません。 – Chakib

関連する問題