在这张照片中,我只使用了标题:
def __unicode__(self):
return self.title;
here is the each individual objects
如何显示所有这些字段?
如何显示每个“模型”页面中的所有字段?
答案 0 :(得分:46)
如果要在不键入所有字段名的情况下包含所有字段,可以使用
list_display = BookAdmin._meta.get_all_field_names()
缺点是,字段按排序顺序排列。
修改:
此方法已在Django 1.10中弃用,请参阅Migrating from old API以供参考。对于大多数情况,以下应该适用于Django >= 1.9
-
list_display = [field.name for field in Book._meta.get_fields()]
答案 1 :(得分:35)
默认情况下,管理布局仅显示从对象的 unicode 函数返回的内容。要显示其他内容,您需要在app_dir/admin.py
中创建自定义管理表单。
您需要添加管理表单,并设置list_display
字段。
在您的具体示例中:
class BookAdmin(admin.ModelAdmin):
list_display = ('Title', 'Author', 'Price')
admin.site.register(Book, BookAdmin)
答案 2 :(得分:24)
如果要包含除ManyToManyField字段名称之外的所有字段名称,并使它们与models.py文件中的顺序相同,则可以使用:
list_display = [field.name for field in Book._meta.fields if field.name != "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
或者您可以将其作为mixin:
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以外的东西继承,mixin很有用。
答案 3 :(得分:14)
我发现OBu的答案对我来说非常有用。他提到:
缺点是,字段按排序顺序排列。
对他的方法的一个小调整也解决了这个问题:
list_display = [f.name for f in Book._meta.fields]
为我工作。
答案 4 :(得分:6)
答案 5 :(得分:4)
这是我的方法,适用于任何模型类:
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.register(MyModel, MySpecialAdmin(MyModel))
注意:如果您使用的是其他默认型号管理员,请替换' admin.ModelAdmin'与您的管理员基础类
答案 6 :(得分:3)
显示所有字段:
list_display = [field.attname for field in BookModel._meta.fields]
答案 7 :(得分:3)
其中大多数答案的问题是,如果您的模型包含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]
答案 8 :(得分:1)
这里找到的每个解决方案都会引发这样的错误
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]
答案 9 :(得分:0)
我喜欢this answer,并认为我会发布完整的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))
答案 10 :(得分:0)
我正在使用 Django 3.1.4
,这是我的解决方案。
我有模特资质
模型.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__')
在这里我显示 list_display 中的所有字段,不包括 'id'、'qual_key'、'qual_desc' 并在开头插入 '__str__'
。
当您有大量模态字段时,此答案很有帮助,但我建议将所有字段一一编写以获得更好的功能。
答案 11 :(得分:0)
list_display = [Book._meta.get_fields() 中字段的field.name]
即使使用 python 3.9 这也应该工作
快乐编码