61

こちらがモデルページです

この写真では、タイトルのみがここに表示されています。私は次のように使用しました。

def __unicode__(self):
    return self.title;  

これが個々のオブジェクトです

これらすべてのフィールドを表示するにはどうすればよいですか?

各モデルページのすべてのフィールドを表示するにはどうすればよいですか?

4

12 に答える 12

87

すべてのフィールド名を入力せずにすべてのフィールドを含める場合は、次を使用できます。

list_display = BookAdmin._meta.get_all_field_names()

欠点は、フィールドがソートされた順序になっていることです。

編集:

このメソッドはDjango1.10で非推奨になりました。参照用に古いAPIからの移行を参照してください。ほとんどの場合、代わりに以下が機能するはずですDjango >= 1.9-

list_display = [field.name for field in Book._meta.get_fields()]
于 2013-09-12T20:57:19.093 に答える
75

デフォルトでは、管理レイアウトはオブジェクトのUnicode関数から返されるもののみを表示します。他のものを表示するには、でカスタム管理フォームを作成する必要がありますapp_dir/admin.py

ここを参照してください:https ://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

管理フォームを追加し、フィールドを設定する必要がありlist_displayます。

特定の例(admin.py)では:

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'price')
admin.site.register(Book, BookAdmin)
于 2012-05-11T00:05:42.110 に答える
44

ManyToManyFieldフィールド名を除くすべてを含め、models.pyファイルと同じ順序にする場合は、次を使用できます。

list_display = [field.name for field in Book._meta.fields if field.name != "id"]

ご覧のとおり、IDも除外しました。

これを頻繁に行う場合は、ModelAdminのサブクラスを作成できます。

class CustomModelAdmin(admin.ModelAdmin):
    
    def __init__(self, model, admin_site):
        self.list_display = [field.name for field in model._meta.fields if field.name != "id"]
        super(CustomModelAdmin, self).__init__(model, admin_site)

そしてそれから継承します:

class BookAdmin(CustomModelAdmin):
    pass

または、ミックスインとして実行できます。

class CustomModelAdminMixin(object):

    def __init__(self, model, admin_site):
        self.list_display = [field.name for field in model._meta.fields if field.name != "id"]
        super(CustomModelAdminMixin, self).__init__(model, admin_site)

class TradeAdmin(CustomModelAdminMixin, admin.ModelAdmin):
    pass

ミックスインは、admin.ModelAdmin以外から継承する場合に便利です。

于 2015-01-31T18:51:12.433 に答える
17

ここでのOBuの答えは私にとって非常に有用であることがわかりました。彼は言及します:

欠点は、フィールドがソートされた順序になっていることです。

彼の方法を少し調整すると、この問題も解決されます。

list_display  = [f.name for f in Book._meta.fields]

私のために働いた。

于 2016-05-31T11:48:27.200 に答える
9

答えの多くはDjango1.10によって破られています。バージョン1.10以降の場合、これは次のようになります。

list_display = [f.name for f in Book._meta.get_fields()]

ドキュメント

于 2017-07-18T06:32:10.903 に答える
7

これらの回答のほとんどの問題は、モデルにManyToManyFieldまたはForeignKeyフィールドが含まれていると破損することです。

本当に怠け者のために、あなたはあなたの中でこれをすることができますadmin.py

from django.contrib import admin
from my_app.models import Model1, Model2, Model3


@admin.register(Model1, Model2, Model3)
class UniversalAdmin(admin.ModelAdmin):
    def get_list_display(self, request):
        return [field.name for field in self.model._meta.concrete_fields]
于 2020-08-23T00:24:07.370 に答える
5

これが私のアプローチで、どのモデルクラスでも機能します。

MySpecialAdmin = lambda model: type('SubClass'+model.__name__, (admin.ModelAdmin,), {
    'list_display': [x.name for x in model._meta.fields],
    'list_select_related': [x.name for x in model._meta.fields if isinstance(x, (ManyToOneRel, ForeignKey, OneToOneField,))]
})

これは2つのことを行います:

  1. モデル管理者にすべてのフィールドを追加
  2. 関連するオブジェクトごとに(インスタンスごとに1つではなく)、データベース呼び出しが1つだけであることを確認します。

次に、モデルを登録します。

admin.site.register(MyModel, MySpecialAdmin(MyModel))

注:別のデフォルトモデル管理者を使用している場合は、「admin.ModelAdmin」を管理者基本クラスに置き換えてください

于 2017-06-02T12:11:12.100 に答える
3

すべてのフィールドを表示:

list_display = [field.attname for field in BookModel._meta.fields]
于 2017-10-31T06:43:18.210 に答える
2

ここで見つかったすべての解決策は、このようなエラーを引き起こします

The value of 'list_display[n]' must not be a ManyToManyField.

モデルにMany to Manyフィールドが含まれている場合。

私のために働いた可能な解決策は次のとおりです。

list_display = [field.name for field in MyModel._meta.get_fields() if not x.many_to_many]

于 2019-09-29T17:45:32.623 に答える
1

私はこの回答が好きで、完全なadmin.pyコードを投稿すると思いました(この場合、すべてのユーザーモデルフィールドをadminに表示したいと思いました)

from django.contrib import admin
from django.contrib.auth.models import User
from django.db.models import ManyToOneRel, ForeignKey, OneToOneField


MySpecialAdmin = lambda model: type('SubClass'+model.__name__, (admin.ModelAdmin,), {
    'list_display': [x.name for x in model._meta.fields],
    'list_select_related': [x.name for x in model._meta.fields if isinstance(x, (ManyToOneRel, ForeignKey, OneToOneField,))]
})

admin.site.unregister(User)
admin.site.register(User, MySpecialAdmin(User))
于 2019-12-24T18:52:44.420 に答える
1

list_display = [Book._meta.get_fields()のフィールドのfield.name]

これはPython3.9でも機能するはずです

ハッピーコーディング

于 2021-03-20T10:45:32.477 に答える
0

私はDjangoを使用し3.1.4ていますが、これが私の解決策です。

モデル資格を持っています

model.py

from django.db import models

TRUE_FALSE_CHOICES = (
    (1, 'Yes'),
    (0, 'No')
)


class Qualification(models.Model):
    qual_key = models.CharField(unique=True, max_length=20)
    qual_desc = models.CharField(max_length=255)
    is_active = models.IntegerField(choices=TRUE_FALSE_CHOICES)
    created_at = models.DateTimeField()
    created_by = models.CharField(max_length=255)
    updated_at = models.DateTimeField()
    updated_by = models.CharField(max_length=255)

    class Meta:
        managed = False
        db_table = 'qualification'

admin.py

from django.contrib import admin
from models import Qualification


@admin.register(Qualification)
class QualificationAdmin(admin.ModelAdmin):
    list_display = [field.name for field in Qualification._meta.fields if field.name not in ('id', 'qual_key', 'qual_desc')]
    list_display.insert(0, '__str__')

ここでは、「id」、「qual_key」、「qual_desc」を除くlist_displayのすべてのフィールドを表示'__str__'し、先頭に挿入しています。

この回答は、モーダルフィールドが多数ある場合に役立ちますが、機能を向上させるために、すべてのフィールドを1つずつ書き込むことをお勧めします。

于 2020-12-28T12:34:40.210 に答える