How to show all fields of model in admin page?

落爺英雄遲暮 提交于 2020-05-24 08:44:48

问题


here is the models page

In this picture, only the title shows up on here, I used:

 def __unicode__(self):
        return self.title;  

here is the each individual objects

How do I show all these fields?

How do I show all the fields in each Model page?


回答1:


By default, the admin layout only shows what is returned from the object's unicode function. To display something else you need to create a custom admin form in app_dir/admin.py.

See here: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

You need to add an admin form, and setting the list_display field.

In your specific example (admin.py):

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'price')
admin.site.register(Book, BookAdmin)



回答2:


If you want to include all fields without typing all fieldnames, you can use

list_display = BookAdmin._meta.get_all_field_names()

The drawback is, the fields are in sorted order.

Edit:

This method has been deprecated in Django 1.10 See Migrating from old API for reference. Following should work instead for Django >= 1.9 for most cases -

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



回答3:


If you want to include all but the ManyToManyField field names, and have them in the same order as in the models.py file, you can use:

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

As you can see, I also excluded the id.

If you find yourself doing this a lot, you could create a subclass of 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)

and then just inherit from that:

class BookAdmin(CustomModelAdmin):
    pass

or you can do it as a 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

The mixin is useful if you want to inherit from something other than admin.ModelAdmin.




回答4:


I found OBu's answer here to be very useful for me. He mentions:

The drawback is, the fields are in sorted order.

A small adjustment to his method solves this problem as well:

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

Worked for me.




回答5:


Many of the answers are broken by Django 1.10. For version 1.10 or above, this should be

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

Docs




回答6:


Here is my approach, will work with any model class:

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,))]
})

This will do two things:

  1. Add all fields to model admin
  2. Makes sure that there is only a single database call for each related object (instead of one per instance)

Then to register you model:

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

Note: if you are using a different default model admin, replace 'admin.ModelAdmin' with your admin base class




回答7:


Show all fields:

list_display = [field.attname for field in BookModel._meta.fields]



回答8:


Every solution found here raises an error like this

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

If the model contains a Many to Many field.

A possible solution that worked for me is:

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




回答9:


I like this answer and thought I'd post the complete admin.py code (in this case, I wanted all the User model fields to appear in 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))


来源:https://stackoverflow.com/questions/10543032/how-to-show-all-fields-of-model-in-admin-page

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!