Как показать все поля модели на странице администратора? - программирование
Подтвердить что ты не робот

Как показать все поля модели на странице администратора?

вот страница моделей

На этом снимке здесь отображается только название, я использовал:

 def __unicode__(self):
        return self.title;  

вот каждый отдельный объект

Как показать все эти поля?

Как показать все поля на каждой странице модели?

4b9b3361

Ответ 1

По умолчанию макет администратора показывает только то, что возвращается из функции объекта. Чтобы отобразить что-то еще, вам нужно создать пользовательскую форму администратора в 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)

Ответ 2

Если вы хотите включить все поля без ввода всех имен полей, вы можете использовать

list_display = BookAdmin._meta.get_all_field_names()

Недостатком является то, что поля расположены в отсортированном порядке.

Изменить:

Этот метод устарел в Django 1.10. См. Миграция со старого API для справки. Следующее должно работать вместо Django >= 1.9 для большинства случаев -

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

Ответ 3

Если вы хотите включить имена всех, кроме имена полей 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

или вы можете сделать это как 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.

Ответ 4

Я нашел OBu ответ здесь, чтобы быть очень полезен для меня. Он упоминает:

Недостатком является то, что поля находятся в упорядоченном порядке.

Небольшая корректировка его метода также решает эту проблему:

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

Работал для меня.

Ответ 5

Многие ответы нарушены Джанго 1.10. Для версии 1.10 или выше это должно быть

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

Docs

Ответ 6

Вот мой подход, будет работать с любым классом модели:

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
  • Удостоверяется, что для каждого связанного объекта (вместо одного экземпляра) есть только один вызов базы данных.

Затем зарегистрировать модель:

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

Примечание. Если вы используете другой администратор модели по умолчанию, замените "admin.ModelAdmin" на ваш базовый класс администратора

Ответ 7

Показать все поля:

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

Ответ 8

Каждое найденное здесь решение приводит к ошибке, подобной этой

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]