2012-01-20 15 views
6

Ho uno strano problema nell'amministratore di django list_display. Ogni volta che aggiungo una chiave esterna a list_display, l'intera vista dell'elenco delle modifiche diventa vuota e mostra solo il numero totale di voci.Elenco Django Display admin + ForeignKey = Empty Change List

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) 

Ora mi aspetto questo codice di mostrarmi il nome dell'organizzazione nella ChangeList View, ma invece io get this:

empty changelist :(

Se rimuovo il org nel list_display di ServerAdmin di classe, ottengo questo:

change list with data :(

non ho modificare il modello o ignorare qualsiasi ModelAdmin metodi. Sto usando Mysql (5.1.58) come database che viene fornito con repository ubuntu 11.10.

Sarò davvero felice se potrei ottenere una sloution per questo problema ragazzi. Grazie in anticipo.

+0

In 'models.py' vedo' TlxServer' e in '' admin.py' solo server'. È un errore di battitura? – jcollado

+0

Non è necessario definire un campo automatico. Django crea automaticamente una chiave primaria per ogni tavolo. –

+0

@jcollado: Questo è un errore: P è supponiamo di essere 'Server' – Pannu

risposta

7

I secondo Stefano sul fatto che è necessario aggiungere null=True, blank=True. Ma, penso che tu debba solo aggiungerlo al campo org_name del modello Organization. Questo dovrebbe farsi strada. Deve essere fatto perché hai eseguito inspectdb per creare modelli dal tuo DB legacy. E probabilmente la tabella organization nel DB ha una stringa vuota memorizzata. Pertanto, l'aggiunta di quanto sopra consentirebbe all'amministratore di visualizzare un campo/colonna vuoto.

Inoltre, è anche possibile provare a utilizzare callbacks in situazioni in cui non si desidera apportare modifiche alla definizione del modello come sopra.

+0

OK! Aveva una situazione simile con un altro modello come 'Organization' che aveva un' ForeignKey' in 'User'. Grazie a te e alla 'django-debug-toolbar' Zero'd su' INNER JOINS' che causa l'intero problema. 'inspectdb' non specifica' null = True, balnk = True' e io ero troppo pigro;) per controllare i modelli e il database. Grazie amico, ti devo uno per aver risolto questo misterioso problema. – Pannu

+0

In qualsiasi momento Pannu. Tutti sono qui per imparare e anch'io ho imparato dal tuo problema. –

1

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

fa il seguente lavoro per voi?

admin.py:

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

Ho provato la tua soluzione, anche se per quanto strano possa sembrare, non sembra funzionare. Continuava a spuntare un errore "org__org_name" non è un callable o un attributo di "ServerAdmin" o trovato nel modello "Server". Comunque grazie amico. – Pannu

+0

Non è possibile utilizzare termini che abbracciano le relazioni in list_display, il che potrebbe essere molto utile. Una soluzione alternativa consiste nel definire un metodo nella sottoclasse ModelAdmin che restituisce il valore che si sta cercando e aggiungere il nome di quel metodo a list_display. – glarrain

2

Prova ad aggiungere null=True, blank=True a tutti i campi del modello.

Di solito l'amministratore di django fallirà in modo assoluto (quindi non mostra alcun record nell'elenco) se la riga non convalida i vincoli del modello.

+0

sorry man, Sandeep ha perfezionato la tua risposta. Grazie comunque :) – Pannu

0

Ho avuto un problema simile e risolto in questo modo (usando il tuo esempio):

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)