¿Puede "list_display" en Django ModelAdmin mostrar atributos de campos ForeignKey?
Tengo un Person
modelo que tiene una relación de clave externa con Book
, que tiene varios campos, pero lo que más me preocupa author
(un CharField estándar).
Dicho esto, en mi PersonAdmin
modelo, me gustaría mostrar book.author
usando list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
Probé todos los métodos obvios para hacerlo, pero nada parece funcionar.
¿Alguna sugerencia?
Como otra opción, puedes realizar búsquedas como:
#models.py
class UserAdmin(admin.ModelAdmin):
list_display = (..., 'get_author')
def get_author(self, obj):
return obj.book.author
get_author.short_description = 'Author'
get_author.admin_order_field = 'book__author'
Desde Django 3.2 puedes usar display()
el decorador:
#models.py
class UserAdmin(admin.ModelAdmin):
list_display = (..., 'get_author')
@admin.display(ordering='book__author', description='Author')
def get_author(self, obj):
return obj.book.author
A pesar de todas las excelentes respuestas anteriores y debido a que soy nuevo en Django, todavía estaba estancado. Aquí está mi explicación desde una perspectiva muy novato.
modelos.py
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=255)
admin.py (forma incorrecta) : cree que funcionaría usando 'model__field' como referencia, pero no es así
class BookAdmin(admin.ModelAdmin):
model = Book
list_display = ['title', 'author__name', ]
admin.site.register(Book, BookAdmin)
admin.py (forma correcta) : así es como se hace referencia a un nombre de clave externa a la manera Django
class BookAdmin(admin.ModelAdmin):
model = Book
list_display = ['title', 'get_name', ]
def get_name(self, obj):
return obj.author.name
get_name.admin_order_field = 'author' #Allows column order sorting
get_name.short_description = 'Author Name' #Renames column head
#Filtering on side - for some reason, this works
#list_filter = ['title', 'author__name']
admin.site.register(Book, BookAdmin)
Para referencia adicional, consulte el enlace del modelo Django aquí.