Создание 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)