2013-01-14 26 views
9

Wierzę, że odpowiedź na mój problem jest prosta, ale nie mogę go nigdzie znaleźć. Oto moje kłopotliwe położenie. Mam dwa modele: członek i MemberDetail, które są w stosunku oneToOne tak:Administrator Django: Jak wyświetlić wartość pól z listing_pisemią z dwóch modeli, które są w relacji 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) 

Teraz w moim admin.py Chcę pokazać tabeli dla państw ze wszystkich swoich danych, na przykład:

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) 

Po prostu nie wiem, jak napisać "date_of_birth", "e-mail" i "telefon" część listy display_play. Najbliższą rzeczą, jaką mogłem zrobić, było dodanie tego po 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 

, ale pola pokazały puste na stronie. Jakie jest rozwiązanie? Dzięki.

Odpowiedz

16

Wreszcie !!! Rozwiązałem to. Jak myślałem, że to proste, ale musiałem to zrobić odwrót i na multi tabeli dziedziczenia:

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) 

teraz admin.py

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

admin.site.register(MemberDetail, MemberDetailAdmin) 

to wszystko. Być może istnieją inne rozwiązania, ale jest to dla mnie dobre.

0

Trzeba tylko być w stanie zrobić 'member_detail__email', itp list_display

ponieważ jest to 1-1 trzeba mieć backref i związane z nimi pola są oznaczone za pomocą dwóch podkreśleń.

+4

Dzięki za powtórkę. Jestem zdezorientowany przez część "member_detail__email". Próbowałem, ale jeśli dodam, Django zgłasza błąd, który nie jest wywoływalny lub atrybut "MemberAdmin" lub znaleziony w modelu "Member". Znalazłem kod, który wygląda jak rozwiązanie. Działa jak Member.objects.get(), ale nie wiem, jak to zrobić. – sninja

+0

jakie masz opcje? Zwykle daje ci listę. – Colleen

+0

Kolejny ślepy zaułek. Mówi zbyt wiele wartości do zdobycia lub coś w tym stylu. Podoba mi się twój pomysł z backref, ale po prostu nie rozumiem, jak to napisać. Chcę, aby rozwiązanie było eleganckie, na przykład: Member__MemberDetail__EMAIL. Ale jeśli wystąpił błąd "" i błąd "" w środku. Może coś mi brakuje. Chodzi o to, że członek nie rejestruje MemberDetail. Robi to na formularzu dodawania przez administratora lub formularza zmiany. Ale w widoku listy nie mogę pokazać tych pól z elementu MemberDetail. – sninja