11

在 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 以控制在管理员的更改列表页面上显示哪些字段。”

然而,这似乎根本不起作用。难道我做错了什么?

4

3 回答 3

33

__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

    ...
于 2009-10-20T13:00:35.797 回答
10

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
于 2009-10-20T13:03:07.427 回答
3

值得一提的是,如果您为模型使用自动递增的主键,则需要将其强制转换为字符串,例如:

def __unicode__(self):
    return str(self.pk)
于 2009-12-23T06:07:08.457 回答