На этом снимке здесь отображается только название, я использовал:
def __unicode__(self):
return self.title;
Как показать все эти поля?
Как показать все поля на каждой странице модели?
На этом снимке здесь отображается только название, я использовал:
def __unicode__(self):
return self.title;
Как показать все эти поля?
Как показать все поля на каждой странице модели?
По умолчанию макет администратора показывает только то, что возвращается из функции объекта. Чтобы отобразить что-то еще, вам нужно создать пользовательскую форму администратора в 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)
Если вы хотите включить все поля без ввода всех имен полей, вы можете использовать
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()]
Если вы хотите включить имена всех, кроме имена полей 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.
Я нашел OBu ответ здесь, чтобы быть очень полезен для меня. Он упоминает:
Недостатком является то, что поля находятся в упорядоченном порядке.
Небольшая корректировка его метода также решает эту проблему:
list_display = [f.name for f in Book._meta.fields]
Работал для меня.
Многие ответы нарушены Джанго 1.10. Для версии 1.10 или выше это должно быть
list_display = [f.name for f in Book._meta.get_fields()]
Вот мой подход, будет работать с любым классом модели:
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" на ваш базовый класс администратора
Показать все поля:
list_display = [field.attname for field in BookModel._meta.fields]
Каждое найденное здесь решение приводит к ошибке, подобной этой
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]