У меня есть Person
модель, которая имеет отношение внешнего ключа Book
, с несколькими полями, но меня больше всего беспокоит author
(стандартный CharField).
Учитывая сказанное, в моей PersonAdmin
модели я хотел бы отобразить book.author
с помощью list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
Я испробовал все очевидные методы для этого, но, похоже, ничего не работает.
Какие-либо предложения?
get_author
, поскольку именно на эту строку вы действительно ссылаетесь (и краткое описание)? Или изменить аргумент формата строки наobj.book.reviews
?author = ForeignKey(Author)
в книжной модели, а потомlist_display = ('author')
?select_related
.get_queryset()
изUserAdmin
должны быть перезаписаны.Несмотря на все замечательные ответы выше и из-за того, что я был новичком в Django, я все еще застрял. Вот мое объяснение с точки зрения новичка.
models.py
admin.py (Неверный путь) - вы думаете, что он будет работать, используя 'model__field' для ссылки, но это не так
admin.py (правильный путь) - так вы ссылаетесь на имя внешнего ключа способом Django
Для дополнительной ссылки, смотрите ссылку на модель Django здесь
источник
obj
естьBookAdmin
?Как и все остальное, я тоже ходил с вызовами. Но у них есть один недостаток: по умолчанию вы не можете заказать их. К счастью, для этого есть решение:
Джанго> = 1.8
Джанго <1,8
источник
def author(self, obj):
Пожалуйста, обратите внимание, что добавление
get_author
функции замедлит list_display в администраторе, потому что показ каждого человека сделает запрос SQL.Чтобы избежать этого, вам нужно изменить
get_queryset
метод в PersonAdmin, например:источник
__str__
маршруту, просто добавьте иностранный ключ кlist_display
иlist_select_related
Согласно документации, вы можете отобразить только
__unicode__
представление ForeignKey:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
Кажется странным, что он не поддерживает
'book__author'
формат стиля, который используется везде в API БД.Оказывается, есть билет для этой функции , который помечен как не исправлять.
источник
Я только что опубликовал фрагмент, в котором admin.ModelAdmin поддерживает синтаксис __:
http://djangosnippets.org/snippets/2887/
Так что вы можете сделать:
В основном это просто делает то же самое, что описано в других ответах, но он автоматически заботится о (1) установке admin_order_field (2) установке short_description и (3) изменении набора запросов, чтобы избежать попадания в базу данных для каждой строки.
источник
AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Вы можете показать все, что вы хотите в списке отображения с помощью вызываемой. Это будет выглядеть так:
источник
Этот уже принят, но если есть какие-то другие манекены (например, я), которые не сразу получили его из принятого в настоящее время ответа , то здесь немного подробнее.
Класс модели, на который ссылается
ForeignKey
потребность, должен иметь__unicode__
метод внутри, как здесь:Это имело значение для меня, и должно относиться к вышеописанному сценарию. Это работает на Django 1.0.2.
источник
def __str__(self):
.Если у вас есть много полей атрибутов отношения для использования,
list_display
и вы не хотите создавать функцию (и ее атрибуты) для каждого из них,ModelAdmin
грязное__getattr__
, но простое решение переопределит метод instace , создавая вызовы на лету:Как суть здесь
Вызываемые особенные атрибуты, такие как
boolean
иshort_description
должны быть определены какModelAdmin
атрибуты, например,book__author_verbose_name = 'Author name'
иcategory__is_new_boolean = True
.admin_order_field
Атрибут callable определяется автоматически.Не забудьте использовать атрибут list_select_related,
ModelAdmin
чтобы Django избегал дополнительных запросов.источник
В PyPI есть очень простой в использовании пакет, который обрабатывает именно это: django-related-admin . Вы также можете увидеть код в GitHub .
Используя это, вы просто хотите:
Обе ссылки содержат полную информацию об установке и использовании, поэтому я не буду вставлять их сюда в случае их изменения.
Так же , как примечание стороны, если вы уже используете что - то другое , чем
model.Admin
(например , я используюSimpleHistoryAdmin
вместо этого), вы можете сделать это:class MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)
.источник
если вы попробуете это в Inline, вы не добьетесь успеха, если:
в вашей строке:
в вашей модели (MyModel):
источник
Ответ AlexRobbins работал для меня, за исключением того, что первые две строки должны быть в модели (возможно, это предполагалось?), И должны ссылаться на себя:
Тогда админ часть работает хорошо.
источник
Я предпочитаю это:
источник