2011-02-01 2 views
5

Voici un extrait de models.pychamps parents d'affichage dans admin Childs (list_display)

class Applicant(models.Model): 
    name = models.CharField(...) 
    email = models.CharField(...) 

class Application(models.Model): 
    applicant = models.ForeignKey(Applicant) 
    text = models.TextField(...) 

Voici mon admin.py:

class ApplicationAdmin(model.ModelAdmin): 
    list_display = ['text', *******] 

admin.site.register(Application, ApplicationAdmin) 

Dans le ApplicationAdmin je veux présenter le Nom des candidats et email.

Qu'avez-vous essayé avant de demander à SO?
J'ai regardé le code suivant, qui ne le fait pas travail:

list_display = ['text', 'applicant__name','applicant__email'] 

J'ai regardé ModelAdmin.inlines mais comme on peut le voir, la relation parent/enfant doit être inversée.

Des suggestions? Comment puis-je afficher le nom d'un candidat/email dans Applications admin. Prefferably sans migrer la base de données avec de nouveaux champs, etc.

+0

double possible de [Can "liste \ _display" dans un attributs d'affichage Django ModelAdmin des champs ForeignKey?] (http://stackoverflow.com/questions/163823/can-list-display-in-a-django-modeladmin-display-attributes-of-foreignkey-field) –

Répondre

10

Vous pouvez le faire comme la quatrième possibilité dans le list_display docs. Il suffit d'ajouter une méthode à votre modèle d'application comme ceci:

class Application(models.Model): 
    applicant = models.ForeignKey(Applicant) 
    text = models.TextField(...) 

    def applicant_name(self): 
     return self.applicant.name 
    applicant_name.short_description = 'Applicant Name' 

    def applicant_email(self): 
     return self.applicant.email 
    applicant_email.short_description = 'Applicant Email' 

Et vous pouvez configurer votre ModelAdmin comme ceci:

class ApplicationAdmin(model.ModelAdmin): 
    list_display = ['text', 'applicant_name', 'applicant_email'] 
+0

Je peux confirmer que cela fonctionne aussi. Merci pour votre réponse! – hermansc

+0

Oui ... La solution acceptée a été modifiée pendant que je publiais ceci. Bonne chance avec vos modèles! – meshantz

+0

c'est probablement le meilleur moyen –

0

Si vous avez seulement besoin de l'afficher dans la liste:

class Applicant(models.Model): 
    name = models.CharField(...) 
    email = models.CharField(...) 

    def __unicode__(self): 
     return "%s <%s>" % (self.name, self.email) 

class ApplicationAdmin(model.ModelAdmin): 
    list_display = ['text', 'applicant'] 

Réponse à votre commentaire

mais aimeraient avoir chacun champ comme une nouvelle ligne/ligne dans l'admin, pas comme une chaîne.

Je ne sais pas si elle est la meilleure solution availabe mais il fonctionnera:

class Application(models.Model): 

    @property 
    def applicant__name(self): 
     return self.applicant.name 

    # or maybe: 

    def __getattr__(self, name): 
     if name.startswith('applicant__'): 
      return gettattr(self.applicant, 
          name[len('applicant__'):]) 
     raise AttributeError() 

class ApplicationAdmin(model.ModelAdmin): 
    list_display = ['text', 'applicant__name'] 
+0

Fonctionne comme une alternative s'il y a n'est pas une autre solution, mais voudrait avoir chaque champ comme une nouvelle ligne/ligne dans l'admin, pas comme une chaîne. Merci pour votre réponse, profondément appriciée. – hermansc

+0

N'a pas essayé votre "peut-être" solution. Mais l'autre fonctionne comme un charme, même sans "propriété". – hermansc

Questions connexes