Создание Django admin отображает первичный ключ, а не каждый объект Тип объекта

В Django 1.1 admin, когда я иду добавить или изменить объект, мои объекты отображаются как:

Select host to change
    * Add host

    Host object
    Host object
    Host object
    Host object
    Host object

Это происходит для всех моделей моего сайта, а не только для хостов.

Вместо того, чтобы отображать одно и то же имя для каждого объекта, я хотел бы, чтобы Django отображал первичный ключ.

Select host to change
    * Add host

    machine1
    machine2

Вот мой код:

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

Чтение http://docs.djangoproject.com/en/dev/ref/contrib/admin/:

"ModelAdmin.list_display

Установите list_display, чтобы контролировать, какие поля отображаются на странице списка изменений администратора.

Однако это просто не работает. Я что-то делаю неправильно?

Ответ 1

Добавьте __unicode__() метод Host. Чтобы показать первичный ключ ваших объектов хоста, вам нужно что-то вроде:

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

    def __unicode__(self):
        return self.pk

    ...

Возможно, вам стоит подумать о том, чтобы показать содержимое поля Host:

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

    def __unicode__(self):
        return self.host

    ...

Вам нужно будет сделать что-то подобное для каждой модели.

Для совместимости с Python 3 вы захотите сделать что-то вроде этого (см. документация):

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

    ...

Ответ 2

contrib.admin был переработан в 1.0, а старые Admin классы внутри моделей больше не работают. Вам нужен подкласс ModelAdmin в модуле your_application.admin, например

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

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

admin.site.register(Host, HostAdmin)

Или используйте __unicode__ в самой модели, например

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

    def __unicode__(self):
        return self.host

Ответ 3

Можно также отметить, что если вы используете первичный ключ с автоматическим добавлением для ваших моделей, вам нужно будет принудить его к строке, например:

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