2010-03-18 5 views
37

Si un modèle de django contient un champ de clé étrangère, et si ce champ est affiché en mode liste, il apparaît comme texte, au lieu d'afficher un lien à l'objet étranger .clés étrangères dans l'affichage de la liste d'admin django

Est-il possible d'afficher automatiquement toutes les clés étrangères en tant que liens au lieu d'un texte plat?

(bien sûr, il est possible de le faire sur un terrain par base sur le terrain, mais est-il une méthode générale?)

Exemple:

class Author(models.Model): 
    ... 

class Post(models.Model): 
    author = models.ForeignKey(Author) 

Maintenant, je choisis une ModelAdmin telle que l'auteur montre en mode liste:

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

maintenant en mode liste, le champ auteur utilisera simplement la méthode __unicode__ de la classe Author pour afficher l'auteur. En plus de cela, je voudrais un lien pointant vers l'URL de l'auteur correspondant dans le site d'administration. Est-ce possible?

Méthode manuelle:

Par souci d'exhaustivité, j'ajouter la méthode manuelle. Il serait d'ajouter une méthode author_link dans la classe PostAdmin:

def author_link(self, item): 
    return '<a href="../some/path/%d">%s</a>' % (item.id, unicode(item)) 
author_link.allow_tags = True 

qui fonctionnera pour ce domaine particulier, mais qui est pas ce que je veux. Je veux une méthode générale pour obtenir le même effet. (Un des problèmes est comment trouver automatiquement le chemin vers un objet dans le site d'administration django.)

Répondre

9

Je ne pense pas qu'il existe un mécanisme pour faire ce que vous voulez automatiquement hors de la boîte.

Mais aussi loin que la détermination du chemin d'accès à une page d'édition admin basé sur l'identifiant d'un objet, il vous suffit de deux informations:

a) self.model._meta.app_label

b) self.model._meta.module_name

Ensuite, par exemple, pour aller à la page d'édition pour ce modèle que vous feriez:

'../%s_%s_change/%d' % (self.model._meta.app_label, self.model._meta.module_name, item.id) 

Jetez un oeil à django.contrib.admin.options.ModelAdmin.get_urls pour voir comment ils le font. Je suppose que vous pourriez avoir un callable qui prend un nom de modèle et un identifiant, crée un modèle du type spécifié juste pour obtenir l'étiquette et le nom (pas besoin de frapper la base de données) et génère l'URL a ci-dessus. Mais êtes-vous sûr de ne pas pouvoir utiliser les inlines? Cela ferait une meilleure interface utilisateur pour avoir tous les composants liés dans une seule page ...

Edit:

Inlines (lié à docs) permettent une interface d'administration pour afficher une relation parent-enfant dans une page au lieu de le casser en deux. Dans l'exemple Post/Author que vous avez fourni, l'utilisation d'inlines signifierait que la page de modification de Posts afficherait également un formulaire en ligne pour ajouter/modifier/supprimer des Auteurs. Beaucoup plus naturel pour l'utilisateur final. Ce que vous pouvez faire dans votre vue de liste d'admin est de créer un callable dans le modèle de poste qui rendra une liste d'auteurs séparés par des virgules. Ainsi, vous aurez votre vue de la liste des publications montrant les auteurs appropriés, et vous éditerez les auteurs associés à un article directement dans l'interface de Post-administration.

+0

Merci pour cette réponse! Pourriez-vous élaborer sur l'utilisation des inlines? Comment cela aiderait-il? –

+0

@Olivier: J'ai édité ma réponse pour vous diriger dans la bonne direction en ce qui concerne les inlines. – cethegeek

18

Je cherchais une solution au même problème et couru à travers cette question ... fini par résoudre moi-même. Le PO pourrait ne plus être intéressé mais cela pourrait être utile à quelqu'un. Remplacer «partial» par «curry» de Django si vous n'utilisez pas python> = 2.5.

+1

Itai Tavor, merci pour votre réponse, c'était vraiment béat, mais ça peut poser des problèmes, les détails sont dans [ma réponse à une autre question] (http://stackoverflow.com/questions/6473340/link-to-foreignkey- in-admin-causes-attributeerror-when-debug-is-false/7192721 # 7192721). – stepank

+0

Pour moi, en utilisant le chemin absolu de %s fonctionnait mieux, car le lien serait correct sur la page de détail de l'objet, plutôt que sur la page de liste. –

+0

quel est le paramètre de la méthode ModelAdminWith ...? Je n'ai pas de "MediaDefineClass" en tant que formulaire? – Timo

Questions connexes