制作Django管理显示的主键,而不是每个对象的对象类型(Making Django admin d

2019-08-21 17:51发布

在Django 1.1管理员,当我去添加或更改一个对象,我的对象将显示为:

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

然而,这只是似乎并没有工作。 难道我做错了什么?

Answer 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

    ...


Answer 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


Answer 3:

这也可能是值得一提的是,如果你正在使用你的模型自动递增的主键,你需要将其强制转换成字符串,例如:

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


文章来源: Making Django admin display the Primary Key rather than each object's Object type