2016-03-24 8 views
2

私は本当に非常に簡単な作業をしています(一見したところ単純です)。私は管理者の変更リストを並べ替える必要があります。カテゴリがあり、いくつかのカテゴリはネストされているので、同じテーブルに関連する「parent_id」外部キーがあります。djangoのchange_listのモデルの順番を変更する方法

私が必要とするのは、すべてのカテゴリを適切な順序でリストすることだけです。

の代わりに:

"Category1 
subcategory_of_category3 
Category2 
subcategory_of_category_4 
" 

私が必要:

"Category1 
---subcategory_of_category1 
Category2 
----subcategory_of_category2 
" 

何もありません!私はすでに試した何

  1. は、適切な順序で自分のクエリセットを提供します。クエリーセットでそのような並べ替えやグループ化を実行することが不可能であるため、動作しません。
  2. change_list.htmlテンプレートをオーバーライドしようとしました。しかし、カスタムタグ "list_results"があります。削除すると、django adminのすてきな機能がすべて失われています。

私は変更リストを注文する必要がある最初の人ではないと確信しています。解決策はdjangoがあり、

+0

[django-mptt](http://django-mptt.github.io/django-mptt/)が役に立つかもしれません。 – Alasdair

答えて

4

あなたはDBであなたのuni_code関数の結果を格納していない限りDjango Snippet

Django順序がdatabase level.で行われ、リンクを通過上書きすることができます...私が思うに、非常に単純である必要がありますその方法で順序付けされた結果をネイティブに返すことはできません。 DB内の順序値を保存

は、おそらく私がMushahidカーンはアドバイスとして、私のDBにオーダーフィールドを追加することによってそれを解決し、この問題

1

を解決するための最も好都合な方法です。 サイトの実際の管理者が手動で各カテゴリの順序を指定する必要はないので、モデルのsave()メソッドをオーバーライドしなければなりませんでした。

多分、それは非常に不自由で醜い願望ですが、私のプロジェクトではうまくいきます。サイトの所有者は、注文がネストされていると仮定して、各カテゴリの順序を指定したいと決めました。たとえば、「カテゴリ1」、「SubCategory-1-1」、「SubCategory-1-2」などがあります。 'SubCategory-1-1'のオーダーを指定すると、親カテゴリ内の順序(つまり「カテゴリ1」)に影響します。

アルファベット順を使用することに決めました。計算して変更する方がはるかに簡単です。 は、ここに私のsave()メソッド

def save(self, force_insert=False, force_update=False, using=None, 
     update_fields=None): 
    if self.category_parent_id is not None: 
     self._level = '2' 
     if len(self.category_parent._order[0:-1])<2: 
      self._order = '%s%s%s%s' % ('a', self.category_parent._order[0:-1], self.category_order, self._level) 
     else: 
      self._order = '%s%s%s' % (self.category_parent._order, self.category_order, self._level) 
    else: 
     self._level = '1' 
     self._order = '%s%s%s%s'%('a', self.category_order, self._level, str(self.id)) 
     for child in self.children.all(): 
      child._level = '2' 
      if len(self._order[0:-1])<2: 
       child._order = '%s%s%s%s'%('a', self._order[0:-1], child.category_order, child._level) 
      else: 
       child._order = '%s%s%s'%(self._order, child.category_order, child._level) 
      super(Category, child).save() 
    super(Category, self).save() 

それは私が考えて、最適化する必要があるの源ですが、今のところそれだけで動作します。

関連する問題