Peut “list_display” dans un Django ModelAdmin attributs d'affichage de ForeignKey champs?
J'ai un Person
modèle qui a une relation de clé étrangère Book
, qui a un certain nombre de domaines, mais je suis plus préoccupé par author
(d'un standard CharField).
Avec cela étant dit, dans mon PersonAdmin
modèle, j'aimerais afficher book.author
à l'aide de list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
J'ai essayé toutes les évidentes méthodes pour le faire, mais rien ne semble fonctionner.
Des suggestions?
Vous devez vous connecter pour publier un commentaire.
Comme autre option, vous pouvez regarder ups comme:
get_author
, puisque c'est ce que la chaîne que vous êtes de retour (et la description courte) fait référence? Ou de changement de format de chaîne de caractères en argument àobj.book.reviews
?author = ForeignKey(Author)
dans le modèle de carnet, puislist_display = ('author')
?select_related
est pour. leget_queryset()
de laUserAdmin
devra être remplacé.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
admin.py (la mauvaise Voie) - vous qu'il serait de travailler en utilisant le modèle de la "__champ' à la référence, mais il n'a pas
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
Pour plus de renseignements, voir le Django modèle de lien ici
obj
erreurself.foreign_key.name
travaillé!obj
estBookAdmin
?Comme le reste, je suis allé avec callables trop. Mais ils ont un inconvénient: par défaut, vous ne pouvez pas commander sur eux. Heureusement, il existe une solution pour que:
def author(self, obj):
Veuillez noter que l'ajout de la
get_author
fonction de ralentir le list_display dans l'admin, car montrant chaque personne ferait une requête SQL.Pour éviter cela, vous devez modifier
get_queryset
méthode dans PersonAdmin, par exemple:Conformément à la documentation, vous pouvez uniquement afficher le
__unicode__
représentation d'une ForeignKey:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
Me semble bizarre qu'il ne prend pas en charge la
'book__author'
style format qui est utilisé partout ailleurs dans la base de données de l'API.S'avère qu'il y un billet pour cette fonctionnalité, qui est marqué comme ne sera pas Corrigé.
book__author
fonctionne effectivement. (Django 1.2)Vous pouvez montrer ce que vous voulez dans la liste d'affichage à l'aide d'un appelable. Il devrait ressembler à ceci:
Je viens de poster un extrait de code qui fait admin.ModelAdmin soutien '__' syntaxe:
http://djangosnippets.org/snippets/2887/
De sorte que vous pouvez faire:
C'est tout simplement de faire la même chose décrite dans les autres réponses, mais il prend automatiquement soin de (1) la mise en admin_order_field (2) réglage de la short_description et (3) modifiant le queryset pour éviter une base de données frapper pour chaque ligne.
AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Celui déjà accepté, mais si il y a d'autres les nuls il y a (comme moi) qui n'a pas immédiatement l'obtenir à partir de la actuellement accepté de répondre à, voici un peu plus en détail.
La classe du modèle référencé par le
ForeignKey
doit avoir un__unicode__
méthode en elle, comme ici:Qui a fait la différence pour moi, et devrait s'appliquer pour le scénario ci-dessus. Cela fonctionne sur Django 1.0.2.
def __str__(self):
.si vous l'essayez, dans la ligne d'entrée, vous ne réussiront que si:
dans votre en ligne:
dans votre modèle (Monmodèle):
Si vous avez beaucoup de relation attribut champs à utiliser dans
list_display
et ne veulent pas créer une fonction (et attributs) pour chacun d'eux, une saleté, mais la solution la plus simple serait de remplacer leModelAdmin
instace__getattr__
de la méthode, de la création de la callables à la volée:Comme gist ici
Appelable particulier des attributs comme
boolean
etshort_description
doit être défini commeModelAdmin
attributs, par exemplebook__author_verbose_name = 'Author name'
etcategory__is_new_boolean = True
.Remboursables
admin_order_field
attribut est défini automatiquement.N'oubliez pas d'utiliser le list_select_related attribut dans votre
ModelAdmin
pour faire de Django éviter supplément de requêtes.Il est très facile à utiliser paquet disponible dans PyPI qui gère exactement cela: django liées à l'admin. Vous pouvez également voir le code sur GitHub.
À l'aide de ce, ce que vous voulez atteindre est aussi simple que:
Les deux liens contiennent des détails complets sur l'installation et l'utilisation de sorte que je ne pas les coller ici en cas de changement.
Tout comme une note de côté, si vous utilisez déjà quelque chose d'autre que
model.Admin
(par exemple, j'ai été en utilisantSimpleHistoryAdmin
à la place), vous pouvez le faire:class MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)
.AlexRobbins réponse a fonctionné pour moi, sauf que les deux premières lignes doivent être dans le modèle (peut-être que cela a été supposé?), et devrait faire référence à soi-même:
Puis la partie admin fonctionne très bien.
Je préfère ceci: