10

django admin でチェンジリスト ビュー クエリセットを取得する必要があります。現在、4 つの余分なクエリを作成するこのモンキー パッチがあるので、より良い解決策を探しています。

私のポイントは、クエリの作成から取得した django admin change_list.html テンプレートにいくつかの追加の値を渡したいということです。これらのクエリには、要求フィルターが適用された django 管理変更リスト ビューで使用されるクエリセットが必要です。これは、フィルター処理、並べ替えなどで表示されるデータと同じです。このデータからグラフを作成したいと思います。

あなたは私を理解していますか?ありがとう

#admin.py
from django.contrib.admin.views.main import ChangeList

class TicketAdmin(admin.ModelAdmin):

    def changelist_view(self, request, extra_context=None):

        cl = ChangeList(request, 
                        self.model, 
                        self.list_display, 
                        self.list_display_links, 
                        self.list_filter, 
                        self.date_hierarchy, 
                        self.search_fields, 
                        self.list_select_related, 
                        self.list_per_page,
                        self.list_max_show_all, 
                        self.list_editable, 
                        self) # 3 extra queries
        filtered_query_set = cl.get_query_set(request) # 1 extra query

        currencies_count = filtered_query_set.values('bookmaker__currency').distinct().count()

        extra_context = {
            'currencies_count': currencies_count,
        }
        return super(TicketAdmin, self).changelist_view(request, extra_context=extra_context)
4

1 に答える 1

18

これがあなたの質問に答えるかどうかはわかりませんが、クラスには、既にクエリセットを含む(コードはこちらにあります)ChangeListという属性があります。query_sethttps://github.com/django/django/blob/master/django/contrib/admin/views/main.py

ところで、changelist_view()関数 (source at ) は、コンテキストを指すという名前の変数を持つ( https://github.com/django/django/blob/master/django/template/response.pyの ソース) をhttps://github.com/django/django/blob/master/django/contrib/admin/options.py返します。この変数の内容を拡張してみることができます。TemplateResponsecontext_data

以下はテストされていないコードに従います

class TicketAdmin(admin.ModelAdmin):

    def changelist_view(self, request, extra_context=None):
        response = super(TicketAdmin, self).changelist_view(request, extra_context)
        filtered_query_set = response.context_data["cl"].queryset

        currencies_count = filtered_query_set.values('bookmaker__currency').distinct().count()
        extra_context = {
             'currencies_count': currencies_count,
        }
        response.context_data.update(extra_context)

        return response
于 2012-12-30T01:20:25.487 に答える