如何在管理页面中显示模型的所有字段?

iCo*_*unk 33 django-models django-admin

这是模型页面

在这张图片中,只有标题显示在这里,我用过:

 def __unicode__(self):
        return self.title;  
Run Code Online (Sandbox Code Playgroud)

这是每个单独的对象

如何显示所有这些字段?

如何显示每个"模型"页面中的所有字段?

OBu*_*OBu 56

如果要在不键入所有字段名的情况下包含所有字段,则可以使用

list_display = BookAdmin._meta.get_all_field_names()
Run Code Online (Sandbox Code Playgroud)

缺点是,字段按排序顺序排列.

编辑:

Django 1.10中不推荐使用此方法.请参阅从旧API迁移以供参考.以下应该适用Django >= 1.9于大多数情况 -

list_display = [field.name for field in Book._meta.get_fields()]
Run Code Online (Sandbox Code Playgroud)

  • 你应该从模型中提取字段名称list_display = Book._meta.get_all_field_names() (11认同)

Ami*_*shk 42

默认情况下,admin布局仅显示从对象的unicode函数返回的内容.要显示其他内容,您需要在其中创建自定义管理表单app_dir/admin.py.

请参见:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

您需要添加管理表单并设置list_display字段.

在您的具体示例中:

class BookAdmin(admin.ModelAdmin):
    list_display = ('Title', 'Author', 'Price')
admin.site.register(Book, BookAdmin)
Run Code Online (Sandbox Code Playgroud)

  • 根据``Django``风格指南,字段名称应为小写.https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/#model-style (2认同)
  • 您指定的代码块需要添加到`admin.py`或`models.py`中? (2认同)

Kri*_*isF 28

如果要包含除ManyToManyField字段名称之外的所有字段名称,并使它们与models.py文件中的顺序相同,则可以使用:

list_display = [field.name for field in Book._meta.fields if field.name != "id"]
Run Code Online (Sandbox Code Playgroud)

如你所见,我也排除了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)
Run Code Online (Sandbox Code Playgroud)

然后继承自:

class BookAdmin(CustomModelAdmin):
    pass
Run Code Online (Sandbox Code Playgroud)

或者你可以做一个混合:

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
Run Code Online (Sandbox Code Playgroud)

如果要从admin.ModelAdmin以外的其他内容继承,mixin非常有用.


Dan*_*men 17

大多数这些答案的问题是,如果您的模型包含ManyToManyFieldForeignKey字段,它们就会中断。

对于真正的懒惰者,您可以在您的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]
Run Code Online (Sandbox Code Playgroud)


siv*_*anr 14

我发现OBu的回答对我来说非常有用.他提到了:

缺点是,字段按排序顺序排列.

对他的方法的一个小调整也解决了这个问题:

list_display  = [f.name for f in Book._meta.fields]
Run Code Online (Sandbox Code Playgroud)

为我工作.


Jos*_*ian 6

许多答案都被Django 1.10打破了.对于1.10或更高版本,这应该是

list_display = [f.name for f in Book._meta.get_fields()]
Run Code Online (Sandbox Code Playgroud)

文件


Vac*_*zal 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,))]
})
Run Code Online (Sandbox Code Playgroud)

这将做两件事:

  1. 将所有字段添加到模型管理员
  2. 确保每个相关对象只有一个数据库调用(而不是每个实例一个)

然后注册您的模型:

admin.site.register(MyModel, MySpecialAdmin(MyModel))
Run Code Online (Sandbox Code Playgroud)

注意:如果您使用其他默认模型admin,请用admin基类替换'admin.ModelAdmin'