2011-01-31 9 views
4

私はModelAdminクラスのqueryset()をオーバーライドして、adminに表示されるオブジェクトのリストがの2つのレベルでにソートされるようにしようとしています。Django ModelAdminクエリーセットのオーバーライドが機能しません

期待通りにテーブルが

class ProductAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(ProductAdmin, self).queryset(request) 
     return qs.order_by('category','market') 

    list_display = ('category', 'market', 'name', 'quantity') 

admin.site.register(Product, ProductAdmin) 

にソートされていない、すなわち、Djangoは特にその唯一の最初の項目を述べたようところで、あなたはordering = ('category','market')を使用することはできません、私は次のコードを試してみたが、それは動作しません。 (ドキュメントの注記を参照してください)

答えて

1

Djangoの1.4用release notesは、Djangoは今Multiple sort in admin interfaceをサポートしていることを言う:

adminの変更リストは現在、複数列のソートをサポートしています。 は、注文属性のすべての要素を尊重しており、ヘッダーをクリックして 複数の列をソートすると、デスクトップGUIの動作が になります。

そしてModelAdmin orderingから:

セットorderingオブジェクトのリストが Djangoの管理ビューで注文する方法を指定します。これは、モデルのorderingパラメータとして同じ形式のリストまたはタプルである である必要があります。 [...] Djangoの称号すべての要素リスト/タプル; 1.4以前は、最初のものだけが尊重されました。半関連のノートで

- カスタムソート順を提供するために、querysetをオーバーライドしない場合、Changelistは、そのソート順を上書きするようです。 orderingパラメータにある並べ替えが適用され、一致しない場合はpkの既定の並べ替えが適用され、querysetで行った並べ替えが無効になります。

私は動作するようになっていると思い- 少なくともこのDjango Ticketを固定言います。しかし、私は数日前にquerysetを使ってカスタムソートを適用しようとしていましたが、それはまったく機能しませんでした。1つのフィールドでソートしても、最終ビューではオーバーライドされているようです。だから、私は何か間違ったことをしたのか、それともすべてのことを修正したのではない。 :)それコードを経由して、カスタムの並べ替えを行うこと可能ですが、あなたはthis snippetごとに、Changelistをサブクラス化し、そのget_query_set()メソッドをオーバーライドする必要があること

注意。 (これは残念ですが、複数のフィールドをソートする必要がある場合は、Django 1.4は複数のフィールドをサポートするので)。

3

私はこの問題を正確に抱えていました。

私はChangeListをサブクラス化し、以前にChangeList.get_orderingによって変更された正しいORDER_BYをやり直すChangeList.get_query_setをオーバーライド:ここに私がやったことだ(私はジャンゴ-easytreeを使用してい

これは私が私の場合にはやったことですが、同じ。)ジャンゴ・MPTTに適用されます。また

class MyChangeList(ChangeList): 

    def get_query_set(self): 
     qs = super(MyChangeList, self).get_query_set() 

     return qs.order_by('tree_id', 'lft') 

、これらのチケットを確認してください。

+1

これは3年前のチケットで、まだ「新しい」とマークされています。私にデザインバグのように思える... – Jonathan

+0

@Jonathan:合意し、非常にイライラバグ。 – Tiago

7

get_querysetはDjango 1.8で動作します。

関連する問題