让Django管理员显示主键而非对象类型
在Django 1.1的管理后台,当我去添加或修改一个对象时,我看到的对象显示为:
Select host to change
* Add host
Host object
Host object
Host object
Host object
Host object
这种情况在我网站的所有模型中都发生,不仅仅是Hosts。
我希望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可以控制在管理后台的更改列表页面上显示哪些字段。”
但是这似乎根本不起作用。我是不是做错了什么?
3 个回答
3
值得一提的是,如果你在模型中使用的是自动递增的主键,那么你需要把它转换成字符串,比如:
def __unicode__(self):
return str(self.pk)
10
contrib.admin
在1.0版本中进行了重构,之前在模型里面的老旧 Admin
类已经不再适用了。你需要在 your_application.admin
模块中创建一个 ModelAdmin
的子类,比如:
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
33
给你的 Host
类添加一个 __unicode__()
方法。这样可以显示你主机对象的主键,代码可以写成这样:
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
...