2009-10-20 4 views
11

In Django 1.1 admin, quando vado per aggiungere o modificare un oggetto, i miei oggetti vengono visualizzati come:Fare visualizzare Django di amministrazione della chiave primaria piuttosto che il tipo di oggetto di ciascun oggetto

Select host to change 
    * Add host 

    Host object 
    Host object 
    Host object 
    Host object 
    Host object 

Questo accade per tutti i modelli in il mio sito, non solo host.

Invece di visualizzare lo stesso nome per ciascun oggetto, mi piacerebbe che Django visualizzasse la chiave primaria.

Select host to change 
    * Add host 

    machine1 
    machine2 

Ecco il mio codice:

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') 

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

"ModelAdmin.list_display

Set list_display per controllare quali campi vengono visualizzati sulla pagina di elenco cambio di admin ".

Tuttavia, questo semplicemente non sembra funzionare. Sto facendo qualcosa di sbagliato?

risposta

32

Aggiungere un metodo __unicode__() a Host. Per mostrare la chiave primaria degli oggetti di accoglienza, che ci si vuole qualcosa di simile:

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

    def __unicode__(self): 
     return self.pk 

    ... 

Si potrebbe desiderare di pensare che mostra il contenuto del campo host:

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

    def __unicode__(self): 
     return self.host 

    ... 

Avrai bisogno di fai qualcosa di simile per ogni modello che hai.

Per Python 3 compatibilità, ti consigliamo di fare qualcosa di simile (vedi 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 è stato rielaborato in 1.0, e vecchi Admin classi all'interno di modelli non funzionano più. Quello di cui hai bisogno è la sottoclasse ModelAdmin nel modulo your_application.admin, ad es.

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

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

admin.site.register(Host, HostAdmin) 

Oppure utilizzare __unicode__ nel modello stesso, ad es.

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

    def __unicode__(self): 
     return self.host 
3

Potrebbe anche essere la pena ricordare che, se si utilizza una chiave primaria incremento automatico per i vostri modelli, è necessario costringere in una stringa, ad esempio:

def __unicode__(self): 
    return str(self.pk) 
Problemi correlati