2011-02-01 12 views
5

Ecco un frammento di models.pyMostra campi madri in amministrazione Childs (list_display)

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

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

Ecco il mio admin.py:

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

admin.site.register(Application, ApplicationAdmin) 

Nel ApplicationAdmin voglio presentare il Nome e indirizzo dei candidati.

Che cosa hai provato prima di chiedere SO?
ho guardato il seguente codice, che non lo fa lavoro:

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

Ho guardato ModelAdmin.inlines, ma come si può vedere, la relazione padre/figlio deve essere invertita.

Qualche suggerimento? Come posso visualizzare il nome/email di un candidato nell'Admin delle applicazioni. Prefferably senza migrare il database con nuovi campi ecc

+0

Eventuali duplicati di [Can "lista \ _display" in attributi di visualizzazione Django ModelAdmin dei campi ForeignKey?] (http://stackoverflow.com/questions/163823/can-list-display-in-a-django-modeladmin-display-attributes-of-foreignkey-field) –

risposta

10

si può fare come la quarta possibilità nel list_display docs. Basta aggiungere un metodo per il vostro modello di applicazione in questo modo:

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' 

e quindi è possibile configurare il ModelAdmin in questo modo:

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

Posso confermare che anche questo funziona. Grazie per la tua risposta! – hermansc

+0

Sì ... La soluzione accettata è stata modificata mentre stavo postando questo. Buona fortuna con le tue modelle! – meshantz

+0

questo è probabilmente il modo migliore –

0

Se avete solo bisogno di visualizzarla in lista:

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'] 

risposta al tuo commento

ma vorrebbe avere ogni campo come una nuova riga/riga nell'amministratore, non come una stringa.

Non so se è la migliore soluzione di availabe ma funzionerà:

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

Funzionerà come alternativa se ci non è un'altra soluzione, ma vorrei avere ogni campo come una nuova riga/riga nell'amministratore, non come una stringa. Grazie per la tua risposta, profondamente appagato. – hermansc

+0

Non ho provato la tua soluzione "forse". Ma l'altro funziona come un fascino, anche senza "proprietà". – hermansc

Problemi correlati