让Django管理员显示主键而非对象类型

11 投票
3 回答
13426 浏览
提问于 2025-04-15 15:12

在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

    ...

撰写回答