2009-10-20 9 views
11

En Django 1.1 admin, cuando voy a añadir o cambiar un objeto, mis objetos se muestran como:Haciendo Django administrador visualizar la clave principal en lugar de Tipo de objeto de cada objeto

Select host to change 
    * Add host 

    Host object 
    Host object 
    Host object 
    Host object 
    Host object 

Esto sucede en todos los modelos de mi sitio, no solo Hosts.

En lugar de mostrar el mismo nombre para cada objeto, me gustaría que Django muestre la clave principal.

Select host to change 
    * Add host 

    machine1 
    machine2 

Aquí está mi código:

from django.db import models 

# Create your models here. 

class Host(models.Model): 
    host = models.CharField(max_length=100,primary_key=True) 
    class Admin: 
     list_display = ('host') 


class Test(models.Model): 
    testname = models.CharField(max_length=100,primary_key=True) 
    class Admin: 
     list_display = ('testname') 

class Result(models.Model): 
    host = models.ForeignKey(Host) 
    TESTRESULT_CHOICES = (
     ('P', 'Pass'), 
     ('F', 'Fail'), 
    ) 
    testresult = models.CharField(max_length=1, choices=TESTRESULT_CHOICES) 
    reason = models.CharField(max_length=100) 
    time = models.DateTimeField() 
    testname = models.OneToOneField(Test, primary_key=True) 
    class Admin: 
     list_display = ('host','testname','time','testresult','reason') 

lectura http://docs.djangoproject.com/en/dev/ref/contrib/admin/:

"ModelAdmin.list_display

Conjunto list_display para controlar qué campos se muestran en la página de la lista de cambios del administrador "

Sin embargo, esto simplemente no parece funcionar. ¿Estoy haciendo algo mal?

Respuesta

32

Agregue un método __unicode__() al Host. Para mostrar la clave principal de los objetos de acogida, que querría algo así como:

class Host(models.Model): 
    host = models.CharField(max_length=100, primary_key=True) 

    def __unicode__(self): 
     return self.pk 

    ... 

Es posible que desee pensar en que muestra los contenidos del campo host:

class Host(models.Model): 
    host = models.CharField(max_length=100, primary_key=True) 

    def __unicode__(self): 
     return self.host 

    ... 

Necesitará haga algo similar para cada modelo que tenga.

Para Python 3 compatibilidad, usted querrá hacer algo como esto (ver the documentation):

from __future__ import unicode_literals 
from django.utils.encoding import python_2_unicode_compatible 

@python_2_unicode_compatible 
class Host(models.Model): 
    host = models.CharField(max_length=100, primary_key=True) 

    def __str__(self): 
     return self.host 

    ... 
10

contrib.admin se ha vuelto a trabajar en 1.0, y viejos Admin clases dentro de los modelos ya no funcionan. Lo que necesita es la subclase ModelAdmin en el módulo your_application.admin, p.

from your_application.models import Host 
from django.contrib import admin 

class HostAdmin(admin.ModelAdmin): 
    list_display = ('host',) 

admin.site.register(Host, HostAdmin) 

O use __unicode__ en el modelo en sí, p.

class Host(models.Model): 
    host = models.CharField(max_length=100,primary_key=True) 

    def __unicode__(self): 
     return self.host 
3

También podría valer la pena mencionar que, si está utilizando una clave primaria de incremento automático para sus modelos, tendrá que forzar en una cadena, por ejemplo:

def __unicode__(self): 
    return str(self.pk) 
Cuestiones relacionadas