359 votes

Est-ce que "list_display" dans un Django ModelAdmin peut afficher les attributs des champs ForeignKey?

J'ai un modèle Personne qui a une relation de clé étrangère avec Book. Book a un certain nombre de champs, mais je suis très préoccupé par "author" (un CharField standard).

Cela étant dit, dans mon modèle PersonAdmin, j'aimerais afficher "book.author" en utilisant "list_display". J'ai essayé toutes les méthodes évidentes pour le faire (voir ci-dessous), mais rien ne semble fonctionner. Aucune suggestion?

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

566voto

imjoevasquez Points 4052

Comme autre option, vous pouvez faire des recherches comme:

 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'
 

181voto

Will Points 1283

En dépit de toutes les grandes réponses ci-dessus et en raison de m'être de nouveau à Django, j'étais toujours bloqué. Voici mon explication à partir d'un très débutant point de vue.

models.py

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=255)

class Author(models.Model):
    name = models.CharField(max_length=255)

admin.py (la mauvaise Voie) - vous pensez qu'il serait de travailler en utilisant le modèle de la "__champ' à la référence, mais il n'a pas

class BookAdmin(admin.ModelAdmin):
    model = Book
    list_display = ['title', 'author__name', ]

admin.site.register(Book, BookAdmin)

admin.py (Correcte) - c'est la façon dont vous faites référence à un nom de clé étrangère de la façon 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)

Pour plus de renseignements, voir le Django modèle de lien ici

72voto

Terr Points 867

Comme le reste, je suis allé avec les titres rachetables avec trop. Mais ils ont un inconvénient : par défaut, vous ne pouvez pas commander sur eux. Heureusement, il existe une solution pour cela :

23voto

insin Points 19509

Selon la documentation, vous pouvez uniquement afficher le __unicode__ représentation d'une ForeignKey:

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display

Bizarre qu'il ne supporte pas l' 'book__author' style de format qui est utilisé partout ailleurs dans la base de données de l'API.

Y en a un billet pour cette fonction, qui est marqué comme ne sera pas Corrigé.

13voto

Jack Cushman Points 371

Je viens de poster un extrait qui fait admin. Syntaxe de soutien « __ » ModelAdmin :

http://DjangoSnippets.org/snippets/2887/

Si vous pouvez faire :

C’est fondamentalement juste faire la même chose décrite dans les autres réponses, mais il prend automatiquement soin de (1) mise en admin_order_field breve_description de réglage (2) et (3) modifier la queryset afin d’éviter une base de données pour chaque ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X