2009-10-30 5 views
15

私はモデルバーのアクションを定義しようとしていますが、ユーザーFooに関連するBarオブジェクトのリストのみが必要です。django管理者のクエリーセットをフィルタリングする方法はありますか?

私は管理コードの中でうんざりしてカスタムのクエリーセットを渡す(または管理者のマルチチェックボックスのサポートを乗っ取るカスタムビューを書く)前に、私は可能な方法があるかどうかチェックしたいと思った私はリストビューを取得するようにデータをスライスします。

注:関連ユーザー別に並べ替えようとはしていません。ユーザーごとにフィルタリングするために、デフォルトのリストビューに余分なオプションを追加しようとしていません。 ちょうどバーオブジェクトのリスト特定のユーザーFooを与える特定のURLまたはビューが必要です。

答えて

25

これは文書化されていませんが、標準のチェンジリストビューでは、通常のクエリーセットフィルタパラメータをGET引数として受け入れます。したがって、次のようにすることができます:

+0

可能性の一覧は次のとおりです。https://docs.djangoproject.com/en/dev/ref/models/querysets/#field-lookups – AJP

25

1.1.xを使用している場合、実際にはカスタムクエリーセットを渡すのは非常に簡単です。 ModelAdminのqueryset()メソッドをオーバーライドするだけです。このような何か:

class ThisAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     """ 
     Filter the objects displayed in the change_list to only 
     display those for the currently signed in user. 
     """ 
     qs = super(ThisAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     return qs.filter(owner=request.user) 

これは実際にも1.0.xのブランチで行われますが、あなたのModelAdminの中にもう少し余分なコードを必要とすることができます。

このアプローチの利点は、きれいな管理者のURLが邪魔にならないことです(また、他の人物オブジェクトを表示する方法をユーザーに非常に明確にしてもらうことです)。

+2

これは、管理者が直接編集したモデルで正常に動作します。ドロップダウンで自動入力される外部キーはどうでしょうか? –

+0

limit_choices_to = {} –

+2

'def queryset'はすべての最近のバージョンのDjangoに対して' def get_queryset'です。 –

関連する問題