J'ai un Person
modèle qui a une relation de clé étrangère avec Book
, qui a un certain nombre de champs, mais je suis le plus préoccupé par author
(un CharField standard).
Cela étant dit, dans mon PersonAdmin
modèle, je voudrais afficher en book.author
utilisant list_display
:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
J'ai essayé toutes les méthodes évidentes pour le faire, mais rien ne semble fonctionner.
Aucune suggestion?
get_author
, puisque c'est ce à quoi la chaîne que vous retournez (et la courte description) fait référence? Ou remplacez l'argument de format de chaîne parobj.book.reviews
?author = ForeignKey(Author)
dans le modèle de livre, et ensuitelist_display = ('author')
?select_related
. leget_queryset()
duUserAdmin
devra être écrasé.Malgré toutes les bonnes réponses ci-dessus et étant donné que j'étais nouveau à Django, j'étais toujours coincé. Voici mon explication d'un point de vue très novice.
models.py
admin.py (Incorrect Way) - vous pensez que cela fonctionnerait en utilisant 'model__field' pour faire référence, mais cela ne fonctionne pas
admin.py (Correct Way) - c'est ainsi que vous référencez un nom de clé étrangère à la manière de Django
Pour des références supplémentaires, voir le lien du modèle Django ici
la source
obj
estBookAdmin
?Comme le reste, je suis allé avec des callables aussi. Mais ils ont un inconvénient: par défaut, vous ne pouvez pas commander sur eux. Heureusement, il existe une solution pour cela:
Django> = 1,8
Django <1,8
la source
def author(self, obj):
Veuillez noter que l'ajout de la
get_author
fonction ralentirait le list_display dans l'admin, car afficher chaque personne ferait une requête SQL.Pour éviter cela, vous devez modifier la
get_queryset
méthode dans PersonAdmin, par exemple:la source
__str__
route, il suffit d'ajouter la clé étrangère àlist_display
etlist_select_related
Selon la documentation, vous ne pouvez afficher que la
__unicode__
représentation d'une clé étrangère:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
Semble étrange qu'il ne prend pas en charge le
'book__author'
format de style qui est utilisé partout ailleurs dans l'API DB.Il s'avère qu'il y a un ticket pour cette fonctionnalité , qui est marqué comme ne sera pas réparé.
la source
Je viens de publier un extrait de code qui permet à admin.ModelAdmin de prendre en charge la syntaxe '__':
http://djangosnippets.org/snippets/2887/
Vous pouvez donc faire:
Il s'agit essentiellement de faire la même chose que celle décrite dans les autres réponses, mais cela prend automatiquement en charge (1) la configuration admin_order_field (2) la configuration short_description et (3) la modification du jeu de requêtes pour éviter un accès à la base de données pour chaque ligne.
la source
AttributeError: type object 'BaseModel' has no attribute '__metaclass__'
Vous pouvez afficher tout ce que vous voulez dans l'affichage de la liste en utilisant un appelable. Cela ressemblerait à ceci:
la source
Celui-ci est déjà accepté, mais s'il y a d'autres mannequins (comme moi) qui ne l'ont pas immédiatement obtenu de la réponse actuellement acceptée , voici un peu plus de détails.
La classe de modèle référencée par le
ForeignKey
besoin d'avoir une__unicode__
méthode en elle, comme ici:Cela a fait la différence pour moi et devrait s'appliquer au scénario ci-dessus. Cela fonctionne sur Django 1.0.2.
la source
def __str__(self):
.Si vous avez beaucoup de champs d'attributs de relation à utiliser
list_display
et que vous ne voulez pas créer une fonction (et ses attributs) pour chacun, une solution simple mais sale serait de remplacer la méthodeModelAdmin
instace__getattr__
, créant les callables à la volée:Comme l' essentiel ici
Les attributs spéciaux appelables comme
boolean
etshort_description
doivent être définis comme desModelAdmin
attributs, par exemplebook__author_verbose_name = 'Author name'
etcategory__is_new_boolean = True
.L'
admin_order_field
attribut callable est défini automatiquement.N'oubliez pas d'utiliser l' attribut list_select_related dans votre
ModelAdmin
pour que Django évite les requêtes supplémentaires.la source
Il existe un package très facile à utiliser disponible dans PyPI qui gère exactement cela: django-related-admin . Vous pouvez également voir le code dans GitHub .
En utilisant cela, ce que vous voulez réaliser est aussi simple que:
Les deux liens contiennent tous les détails de l'installation et de l'utilisation, donc je ne les collerai pas ici au cas où ils changeraient.
Tout comme une note de côté, si vous utilisez déjà autre chose que
model.Admin
(par exemple , j'utilisais à laSimpleHistoryAdmin
place), vous pouvez le faire:class MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)
.la source
si vous l'essayez en ligne, vous ne réussirez pas sauf si:
dans votre ligne:
dans votre modèle (MyModel):
la source
La réponse d'AlexRobbins 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 devraient se référencer soi-même:
Ensuite, la partie admin fonctionne bien.
la source
Je préfère ça:
la source