2012-01-20 41 views
6

Tengo un problema extraño en django admin list_display. Cada vez que agregue una clave externa a list_display, la vista de la lista de cambios completa queda en blanco, mostrando solo el número total de entradas.Django admin Lista de la lista + ForeignKey = Vaciar Cambiar la lista

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) 

Ahora yo esperaría que este código me muestre el nombre de la organización en el ChangeList View, pero en lugar de eso consiga esto:

empty changelist :(

Si quito el org en el list_display de ServerAdmin clase, me sale esto:

change list with data :(

que no modificaron la plantilla o anular cualquier ModelAdmin métodos. Estoy usando Mysql (5.1.58) como mi base de datos que viene con el repositorio ubuntu 11.10.

Estaré muy contento de poder conseguir una solución para este problema, chicos. Gracias por adelantado.

+0

En '' Veo models.py' TlxServer' y en '' simplemente admin.py' Server'. ¿Es eso un error tipográfico? – jcollado

+0

No necesita definir un AutoField. Django crea automáticamente una clave principal para cada tabla. –

+0

@jcollado: Eso es un error tipográfico: P se supone que es 'Servidor' – Pannu

Respuesta

7

I segundo Stefano en el hecho de que se va a agregar null=True, blank=True. Pero, creo que solo necesita agregarlo al campo org_name del modelo Organization. Eso debería abrirse paso. Tiene que hacerse porque ha ejecutado inspectdb para crear modelos desde su base de datos heredada. Y probablemente la tabla organization en la base de datos tenga una cadena vacía almacenada. Por lo tanto, agregar lo anterior le permitiría al administrador tener un campo/columna en blanco.

Además, también puede intentar usar callbacks en situaciones en las que no desea realizar cambios en la definición de su modelo como el anterior.

+0

¡Está bien! Tuvo una situación similar con otro modelo como 'Organización' que tenía una' ForeignKey' a 'Usuario'. Gracias a ti y a 'django-debug-toolbar' Zero'd on' INNER JOINS' que causa un problema completo. 'inspectdb' no especifica' null = True, balnk = True' y yo era demasiado vago;) para verificar los modelos y la base de datos. Gracias, hombre, te debo una por resolver este misterioso problema. – Pannu

+0

Anytime Pannu. Todos están aquí para aprender y yo también he aprendido de tu problema. –

1

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

hace lo siguiente trabajo para usted?

admin.py:

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

Intenté su solución, aunque por extraño que parezca, no pareció funcionar. Siguió apareciendo un error ''org__org_name' no es un atributo invocable o un atributo de 'ServerAdmin' o se encuentra en el modelo 'Server'. Gracias de todos modos, hombre. – Pannu

+0

No se pueden usar términos que abarquen las relaciones en list_display, lo que podría ser muy útil. Una solución alternativa es definir un método en la subclase ModelAdmin que devuelve el valor que está buscando y agregar el nombre de ese método a list_display. – glarrain

2

Trate de añadir null=True, blank=True a todos sus campos del modelo.

Por lo general, django admin silenciosamente fallará (por lo tanto, no muestra ningún registro en la lista) si la fila no valida las restricciones del modelo.

+0

perdón, Sandeep refinó tu respuesta. Gracias de todos modos :) – Pannu

0

que tenía un problema similar y lo resolvió así (usando el ejemplo):

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) 
Cuestiones relacionadas