¿Puede "list_display" en Django ModelAdmin mostrar atributos de campos ForeignKey?

Resuelto Huuuze asked hace 15 años • 15 respuestas

Tengo un Personmodelo 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 PersonAdminmodelo, me gustaría mostrar book.authorusando list_display:

class PersonAdmin(admin.ModelAdmin):
    list_display = ['book.author',]

Probé todos los métodos obvios para hacerlo, pero nada parece funcionar.

¿Alguna sugerencia?

Huuuze avatar Oct 03 '08 01:10 Huuuze
Aceptado

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
imjoevasquez avatar Oct 02 '2008 21:10 imjoevasquez

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í.

Will avatar May 19 '2014 21:05 Will