7

Django 管理インターフェースでモデルを注文したいと考えています。デフォルトは、アプリ内のモデルのアルファベット順です。

余分なパッケージなどを作成したり、Django自体を変更したりする必要は避けたいと思います。

これは、Django 管理テンプレートをオーバーライドするか、その他の軽量な方法で行うことができますか?

編集:

todo のリストのような最終的なアイテムを注文したくありません。

admin のインデックスページで異なるモデルを注文したいです。たとえば、 todoはcarsの前に来ます。

4

6 に答える 6

4

テンプレートを上書きし、テンプレートタグを追加して並べ替えることができます。これはスニペットです。変更が必要な場合があります http://djangosnippets.org/snippets/1939/

于 2012-12-23T07:39:09.587 に答える
3

私はあまり良くない答えを残しています。

モデルは django/contrib/admin/sites.py の 448 行目でソートされます

448        # Sort the models alphabetically within each app.
449        for app in app_list:
450            app['models'].sort(key=lambda x: x['name'])

私はこれをテストしていませんが、403 行目の for ループの管理者のインデックス ページでモデルの順序を設定するために使用するモデルの Meta クラスに変数を追加してみてください。

403        for model, model_admin in self._registry.items():
               ,,,
431                    else:
432                        order = model._meta.order
433                        app_dict[app_label] = {
434                            'order': order,
435                            ...

そして、並べ替えを次のように置き換えます。

450            app['models'].sort(key=lambda x: x['order'])
于 2015-10-26T16:39:08.760 に答える
3

軽量な方法はないと思います.1つには、順序を保存する機能がないため、少なくともどこかに新しいデータベースフィールドが含まれ、そのフィールドを取得して必要な順序を見つけるコードが必要です。AdminSite は動的に構築され、データベースに保存されないため、実際には機能しない可能性があります... うーん、Django が何をするか見てみましょう...

インデックス テンプレートは、管理者が登録したアプリの単なるループであり、各アプリ内ではモデルのループです。これらの順序は、https://github.com/django/django/blob/master/django/contrib/admin/sites.pyの 384 行目以降で定義されているため、1 つのフックは AdminSite をサブクラス化し、インデックス メソッドを書き換えることです。 . 新しい AdminSite の作成については、こちらで説明しています: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#adminsite-objects

おそらく、モデルを登録順に表示したい場合は、そのメソッドでソート行を取り出すことができます。

于 2012-12-23T09:28:25.927 に答える
2

モデルを単一の見出しの下にグループ化できるように、プロキシ モデルでこれを行いました。プロキシ モデルの verbose_name と verbose_name_plural を変更するだけで、並べ替え順序を調整できることに気付きました。したがって、最上位の名前は " " + ._meta.verbose_name で実現でき、その他は 1.、2. 3.、... で並べ替えることができます。

これはあなたが探しているものではないと確信していますが、これは許容できる結果で達成できるほど軽量でした.

# foo/admin.py
from django.contrib import admin
from zoo.models import Zoo

class ZooProxy(Zoo):
    class Meta:
        proxy = True
        app_label = 'foo'
        verbose_name = " " + Zoo._meta.verbose_name
        verbose_name_plural = " " + Zoo._meta.verbose_name_plural


# one/admin.py
from django.contrib import admin
from one.models import One

class OneProxy(One):
    class Meta:
        proxy = True
        app_label = 'foo'
        verbose_name = "2. " + One._meta.verbose_name
        verbose_name_plural = "2. " + One._meta.verbose_name_plural


# two/admin.py
from django.contrib import admin
from two.models import Two

class TwoProxy(Two):
    class Meta:
        proxy = True
        app_label = 'foo'
        verbose_name = "1. " + Two._meta.verbose_name
        verbose_name_plural = "1. " + Two._meta.verbose_name_plural

結果はdjango管理者になります:

Foo:
    Zoo
    1. Two
    2. One

-vs-

Foo:
    One
    Two
    Zoo
于 2016-03-19T14:45:20.520 に答える
-3

Django がデフォルトの並べ替えを提供するかどうかはわかりませんが、ModelAdmin オブジェクトを使用して、Django admin にフィルターと並べ替えペインを追加できます。こんな感じです。ここに画像の説明を入力

これらの変更は admin.py ファイルで行う必要があります

class PersonAdmin(ModelAdmin):
    list_filter = ('is_staff', 'company')

list_filter は、並べ替えとフィルタリングの目的に役立つペインを追加します

詳細については、https ://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter をご覧ください。

于 2012-12-23T06:24:46.880 に答える