この写真では、タイトルのみがここに表示されています。私は次のように使用しました。
def __unicode__(self):
return self.title;
これらすべてのフィールドを表示するにはどうすればよいですか?
各モデルページのすべてのフィールドを表示するにはどうすればよいですか?
この写真では、タイトルのみがここに表示されています。私は次のように使用しました。
def __unicode__(self):
return self.title;
これらすべてのフィールドを表示するにはどうすればよいですか?
各モデルページのすべてのフィールドを表示するにはどうすればよいですか?
すべてのフィールド名を入力せずにすべてのフィールドを含める場合は、次を使用できます。
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()]
デフォルトでは、管理レイアウトはオブジェクトの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)
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以外から継承する場合に便利です。
ここでのOBuの答えは私にとって非常に有用であることがわかりました。彼は言及します:
欠点は、フィールドがソートされた順序になっていることです。
彼の方法を少し調整すると、この問題も解決されます。
list_display = [f.name for f in Book._meta.fields]
私のために働いた。
答えの多くはDjango1.10によって破られています。バージョン1.10以降の場合、これは次のようになります。
list_display = [f.name for f in Book._meta.get_fields()]
これらの回答のほとんどの問題は、モデルに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]
これが私のアプローチで、どのモデルクラスでも機能します。
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つのことを行います:
次に、モデルを登録します。
admin.site.register(MyModel, MySpecialAdmin(MyModel))
注:別のデフォルトモデル管理者を使用している場合は、「admin.ModelAdmin」を管理者基本クラスに置き換えてください
すべてのフィールドを表示:
list_display = [field.attname for field in BookModel._meta.fields]
ここで見つかったすべての解決策は、このようなエラーを引き起こします
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]
私はこの回答が好きで、完全な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))
list_display = [Book._meta.get_fields()のフィールドのfield.name]
これはPython3.9でも機能するはずです
ハッピーコーディング
私は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つずつ書き込むことをお勧めします。