2012-01-20 16 views
6

Mam dziwny problem w django admin list_display. Ilekroć dodaję klucz obcy do list_display, cały widok listy zmian jest pusty pokazując tylko całkowitą liczbę wpisów.Django admin Lista wyświetlania + ForeignKey = Pusta lista zmian

models.py:

class Organization(models.Model): 
    org_id = models.AutoField(primary_key=True) 
    org_name = models.CharField(max_length=288) 

    def __unicode__(self): 
     return self.org_name 

    class Meta: 
     db_table = u'organization' 

class Server(models.Model): 
    server_id = models.AutoField(primary_key=True) 
    server_name = models.CharField(max_length=135,verbose_name="Server Name") 
    org = models.ForeignKey(Organization,verbose_name="Organization") 

    def __unicode__(self): 
     return self.server_name 

    class Meta: 
     db_table = u'server' 

admin.py:

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name','org') 
admin.site.register(Server,ServerAdmin) 

Teraz będę oczekiwać ten kod, aby pokazać mi nazwę organizacji w ChangeList View, ale zamiast tego pobierz:

empty changelist :(

Jeśli usunąć org w list_display z ServerAdmin klasie, otrzymuję to:

change list with data :(

nie modyfikować szablon lub zastępują ModelAdmin metod. Używam Mysql (5.1.58) jako mojej bazy danych, która jest dostarczana z repozytorium ubuntu 11.10.

Będę naprawdę zadowolony, jeśli uda mi się uzyskać sloution dla tego problemu. Z góry dziękuję.

+0

W 'models.py' widzę' TlxServer' aw 'admin.py' tylko' Server'. Czy to literówka? – jcollado

+0

Nie musisz definiować AutoField. Django automatycznie tworzy klucz podstawowy dla każdej tabeli. –

+0

@jcollado: To literówka: P to przypuszczenie, że to "serwer" – Pannu

Odpowiedz

7

Po drugie Stefano na fakt, że należy dodać null=True, blank=True. Ale myślę, że wystarczy dodać go do pola org_name modelu . To powinno przejść przez ciebie. Trzeba to zrobić, ponieważ uruchomiłeś inspectdb, aby utworzyć modele ze starszej wersji DB. I prawdopodobnie tabela organization w DB ma przechowywany pusty ciąg. Dodanie powyższego umożliwi administratorowi wyświetlenie pustego pola/kolumny.

Co więcej, można również spróbować użyć callbacks w sytuacjach, w których nie chcesz wprowadzać zmian w definicji modelu, jak wyżej.

+0

W porządku! Miał podobną sytuację z innym modelem, takim jak 'Organizacja', który miał' ForeignKey' do 'Użytkownika'. Dzięki tobie i 'django-debug-toolbar' Zero'd na' INNER JOINS' powoduje cały problem. 'inspectdb' nie określa' null = True, balnk = True' i byłem zbyt leniwy;) aby sprawdzić modele i bazę danych. Dzięki człowieku, jestem Ci winien za rozwiązanie tego tajemniczego problemu. – Pannu

+0

Zawsze Pannu. Wszyscy są tutaj, aby się uczyć i ja też nauczyłem się od twojego problemu. –

1

Patrz: https://stackoverflow.com/a/163968/1104941

wykonuje następujące prace dla Ciebie?

admin.py:

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name','org__org_name') 
admin.site.register(Server,ServerAdmin) 
+0

Próbowałem twojego rozwiązania, chociaż może wydawać się to dziwne, ale nie działało. Ciągle pojawiał się błąd "org__org_name" nie jest wywoływalny lub atrybut "ServerAdmin" lub znajduje się w modelu "Server". Dzięki anyways człowieka. – Pannu

+0

Nie można używać terminów obejmujących relacje na liście wyświetlania_sekcji, co może być bardzo pomocne. Obejściem jest zdefiniowanie metody w podklasie ModelAdmin, która zwraca wartość, której szukasz, i dodanie jej nazwy do list_display. – glarrain

2

spróbuj dodać null=True, blank=True do wszystkich dziedzin modelowych.

Zwykle administrator django wykona operację silenty fail (w ten sposób nie wyświetlą się żadne rekordy na liście), jeśli wiersz nie sprawdzi poprawności ograniczeń modelu.

+0

Przykro mi, człowieku, Sandeep udoskonalił twoją odpowiedź. Dzięki i tak :) – Pannu

0

miałem podobny problem i rozwiązać go w ten sposób (przy użyciu przykład):

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name', 'get_org') 

    def get_org(self, obj): 
     return obj.org.org_name 

    get_org.short_description = 'Org' 

admin.site.register(Server,ServerAdmin) 
Powiązane problemy