2010-12-30 8 views
2

Djangoのadminのlist_displayにモデルを表示しているときに、最初に1つの列をソートし、別の列をソートしたいと思います。 Django admin:list_displayの2番目のレベルの並べ替え

class Customer(models.Model): 
    name = models.CharField(max_length=30) 
    the_date = models.DateField() 

はどのようにこれが達成することができます
は、ここで例のモデルですか?

答えて

1

あなたは管理クラスの「注文」属性を探していると思います。

http://docs.djangoproject.com/en/1.3/ref/contrib/admin/

編集:私の前の答えは間違っています。上記のドキュメントによると、Djangoはタプルの最初のエントリのみを尊重します。これを解決するにはa ticketがありましたが、どこにも行きませんでした。他にも様々な提案された解決策がありましたが、私のバージョンのDjangoで動作するようには思われませんでした。

しかし、今日私はプロジェクトの一環としてこの問題に戻り、最終的に私のために働くものを見つけました。私の解決策はthis Django snippetに基づいていました。完全版のためにここにスニペットコードを掲載します。

from django.contrib import admin 
from django.contrib.admin.views.main import ChangeList 
from tunes.models import Song 

class SpecialOrderingChangeList(ChangeList): 
    def apply_special_ordering(self, queryset): 
     order_type, order_by = [self.params.get(param, None) for param in ('ot', 'o')] 
     special_ordering = self.model_admin.special_ordering 
     if special_ordering and order_type and order_by: 
      try: 
       order_field = self.list_display[int(order_by)] 
       ordering = special_ordering[order_field] 
       if order_type == 'desc': 
        ordering = ['-' + field for field in ordering] 
       queryset = queryset.order_by(*ordering) 
      except IndexError: 
       return queryset 
      except KeyError: 
       return queryset 
     return queryset 

    def get_query_set(self): 
     queryset = super(SpecialOrderingChangeList, self).get_query_set() 
     queryset = self.apply_special_ordering(queryset) 
     return queryset 

class SongAdmin(admin.ModelAdmin): 
    list_display = ['name', 'time', 'artist', 'album', 'track', 'total_tracks'] 
    special_ordering = {'artist': ('artist', 'album', 'track'), 'album': ('album', 'track')} 

    def get_changelist(self, request, **kwargs): 
     return SpecialOrderingChangeList 

admin.site.register(Song, SongAdmin) 
+0

いいえ。 Djangoのドキュメントでは、「Djangoはリスト/タプルの最初の要素のみを尊重し、他の要素は無視されます。 – Jonathan

+0

よく目に付きます。面白いですが、タプルであるため、すべての列によって順序付けされていたと仮定して、このたくさんの時間を使いました。私はそれがなかったことに気付かなかったと思う!その場合は、モデルのModelAdminのqueryset()メソッドをオーバーライドしてソート順を変更する必要があると思います。 – bogeymin

+0

私もそれを試して、それは助けになりませんでした。この方向で成功した場合は、コードを投稿してください。 – Jonathan

0

これはbogeymanに基づいています。4月1日の編集済みの回答ですが、必須の機能に分かれています。私のmodels.pyで

いつものようにモデルでorderingMetaを定義します。admin.pyサブクラスで次に

class Customer(models.Model): 
    name = models.CharField(max_length=30) 
    the_date = models.DateField() 

    class Meta: 
     ordering = ('the_date', 'name') # sort by date then name. 

ChangeListが、最終的にメタで指定された順序でソートするquery_setを強制モデル。

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


class SpecialOrderingChangeList(ChangeList): 
    def get_query_set(self): 
     queryset = super(SpecialOrderingChangeList, self).get_query_set() 
     return queryset.order_by(*self.model._meta.ordering) 

class CustomerAdmin(admin.ModelAdmin): 
    def get_changelist(self, request, **kwargs): 
     return SpecialOrderingChangeList 

admin.site.register(Customer, CustomerAdmin) 

ModelAdminで順序を定義する場合は、あなたもそうすることができます。 return queryset.order_by(*self.model._meta.ordering)return queryset.order_by(*self.model_admin.ordering)に変更し、CustomerAdminordering = ['the_date', 'name']を定義するリストを追加してください。

0

あなたはDjangoの開発版でDjangoのトランクではなく、1.3

https://docs.djangoproject.com/en/dev/ref/contrib/admin/

新を使用することによって、これを達成することができます。

オーダーを指定する必要がある場合(たとえば、ユーザーや言語に応じて)、 get_ordering()メソッドを実装できます。

Django開発版で変更されました。

Djangoはすべての要素を に尊重します。リスト/タプル。 1.4以前は、最初のものだけが尊重されました。

関連する問題