2013-01-14 18 views
9

Credo che la risposta al mio problema sia semplice, ma non riesco a trovarla da nessuna parte. Ecco la mia situazione. Ho due modelli: membro e MemberDetail, che sono in relazione OnetoOne come questo:Django Admin: come visualizzare il valore dei campi con list_display da due modelli che si trovano nella relazione oneToOne?

class Member(models.Model): 
    ID = models.AutoField(primary_key=True) 
    FIRST_NAME = models.CharField('First name', max_length=50) 
    LAST_NAME = models.CharField('Last name', max_length=50) 
    def __unicode__(self): 
     return u'%s %s' % (self.FIRST_NAME, self.LAST_NAME) 

class MemberDetail(models.Model): 
    member = models.OneToOneField(Member, primary_key=True) 
    DATE_OF_BIRTH = models.DateField('Date of birth') 
    EMAIL = models.EmailField('E-mail') 
    PHONE = models.CharField('Phone', max_length=15) 

Ora nel mio admin.py voglio mostrare tavolo per membro con tutti i suoi dati, come questo:

class MemberDetailInline(admin.TabularInline): 
    model = MemberDetail 

class MemberAdmin(admin.ModelAdmin): 
    list_display = ("FIRST_NAME", "LAST_NAME", "date_of_birth", "email", "phone") 
    inlines = [ 
     MemberDetailInline, 
    ] 

admin.site.register(Member, MemberAdmin) 

Semplicemente non so come scrivere "date_of_birth", "email" e "phone" parte di list_display. La cosa più vicina che potrei fare è aggiungere questo dopo inline:

def date_of_birth(self, MemberDetail): 
    return MemberDetail.DATE_OF_BIRTH 
def date_of_birth(self, MemberDetail): 
    return MemberDetail.EMAIL 
def date_of_birth(self, MemberDetail): 
    return MemberDetail.PHONE 

ma i campi sono risultati vuoti a pagina. Qual'è la soluzione? Grazie.

risposta

16

Finalmente !!! L'ho risolto. Come ho pensato che era semplice, ma ho dovuto farlo contrario e con tavolo multi eredità

models.py 
class Member(models.Model): 
    ID = models.AutoField(primary_key=True) 
    FIRST_NAME = models.CharField('First name', max_length=50) 
    LAST_NAME = models.CharField('Last name', max_length=50) 

# Using multi table inheritance - automaticly creates one to one field 
class MemberDetail(Member): 
    DATE_OF_BIRTH = models.DateField('Date of birth') 
    EMAIL = models.EmailField('E-mail') 
    PHONE = models.CharField('Phone', max_length=15) 

Ora, per admin.py

admin.py 
class MemberDetailAdmin(admin.ModelAdmin): 
    list_display = ("FIRST_NAME", "LAST_NAME", "DATE_OF_BIRTH", "EMAIL", "PHONE") 

admin.site.register(MemberDetail, MemberDetailAdmin) 

Questo è tutto. Forse, ci sono altre soluzioni, ma questo è un bene per me.

0

Si dovrebbe solo essere in grado di fare 'member_detail__email', ecc list_display

Dal momento che è un 1-1 si dovrebbe avere un backref, e campi associati si fa riferimento utilizzando due sottolineature.

+4

Grazie per la riproduzione. Sono confuso dalla parte 'member_detail__email'. Ho provato, ma se lo metto Django riporta un errore che non è un callable o un attributo di 'MemberAdmin' o trovato nel modello 'Membro'. Ho trovato un codice che sembra una soluzione. Funziona come Member.objects.get(), ma non so come completarlo. – sninja

+0

quali opzioni ottieni? Di solito ti dà una lista. – Colleen

+0

Un altro vicolo cieco. Dice troppi valori per ottenere o qualcosa del genere. Mi piace la tua idea con backref, ma non capisco come scriverlo. Voglio che la soluzione sia elegante, ad esempio: Member__MemberDetail__EMAIL. Ma se è fuori "" errore e se è dentro "" errore. Forse mi manca qualcosa. Il punto è che il Membro non registra MemberDetail. Agisce su admin aggiungi modulo o cambia forma. Ma in list_display non posso mostrare quei campi da MemberDetail. – sninja