How to show all fields of model in admin page?

后端 未结 11 512
無奈伤痛
無奈伤痛 2021-01-30 16:25

here is the models page

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

 def __unicode__(self):
        return self.title;  

相关标签:
11条回答
  • 2021-01-30 16:50

    The problem with most of these answers is that they will break if your model contains ManyToManyField or ForeignKey fields.

    For the truly lazy, you can do this in your 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]
    
    0 讨论(0)
  • 2021-01-30 16:53

    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()]
    
    0 讨论(0)
  • 2021-01-30 16:54

    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

    0 讨论(0)
  • 2021-01-30 17:00

    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.

    0 讨论(0)
  • 2021-01-30 17:07

    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.

    0 讨论(0)
提交回复
热议问题