2009-10-20 12 views
11

w Django 1.1 Administrator, kiedy idę, aby dodać lub zmienić obiekt, moi obiekty są wyświetlane jako:Making Django Admin wyświetla klucz podstawowy zamiast Typ obiektu Każdy obiekt za

Select host to change 
    * Add host 

    Host object 
    Host object 
    Host object 
    Host object 
    Host object 

Dzieje się tak dla wszystkich modeli moja strona, nie tylko gospodarze.

Zamiast wyświetlać tę samą nazwę dla każdego obiektu, chciałbym, aby Django wyświetlał klucz podstawowy.

Select host to change 
    * Add host 

    machine1 
    machine2 

Oto mój kod:

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

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

„ModelAdmin.list_display

Set list_display sterować które pola są wyświetlane na stronie listy Zmiana administratora . "

Jednak to po prostu nie działa. czy robię coś źle?

Odpowiedz

32

Dodaj metodę __unicode__() do Host. Aby pokazać klucz podstawowy swoich obiektów goszczących, że chcesz coś takiego:

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

    def __unicode__(self): 
     return self.pk 

    ... 

może warto pomyśleć o pokazanie zawartości pola host:

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

    def __unicode__(self): 
     return self.host 

    ... 

Musisz zrobić coś podobnego dla każdego modelu, jaki masz.

dla Pythona 3 kompatybilności, będziemy chcieli, aby zrobić coś takiego (patrz 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 został przerobiony na 1,0, a stare Admin klas wewnątrz modeli nie dłuższą pracę. Potrzebna jest podklasa ModelAdmin w module your_application.admin, np.

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

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

admin.site.register(Host, HostAdmin) 

Lub użyj __unicode__ w samym modelu, np.

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

    def __unicode__(self): 
     return self.host 
3

może być również warto wspomnieć, że jeśli używasz klucza podstawowego autoinkrementacja dla swoich modeli, trzeba będzie zmusić go do łańcucha, np:

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