Making Django admin display the Primary Key rather

2019-03-13 04:14发布

In Django 1.1 admin, when I go to add or change an object, my objects are displayed as:

Select host to change
    * Add host

    Host object
    Host object
    Host object
    Host object
    Host object

This happens for all models in my site, not just Hosts.

Rather than display the same name for each object, I would like Django to display the primary key.

Select host to change
    * Add host

    machine1
    machine2

Here is my code:

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')

Reading http://docs.djangoproject.com/en/dev/ref/contrib/admin/:

"ModelAdmin.list_display

Set list_display to control which fields are displayed on the change list page of the admin."

However this simply does not seem to work. Am I doing something wrong?

3条回答
聊天终结者
2楼-- · 2019-03-13 04:52

contrib.admin has been reworked in 1.0, and old Admin classes inside models no longer work. What you need is ModelAdmin subclass in your_application.admin module, e.g.

from your_application.models import Host
from django.contrib import admin

class HostAdmin(admin.ModelAdmin):
    list_display = ('host',)

admin.site.register(Host, HostAdmin)

Or use __unicode__ in the model itself, e.g.

class Host(models.Model):
    host = models.CharField(max_length=100,primary_key=True)

    def __unicode__(self):
        return self.host
查看更多
时光不老,我们不散
3楼-- · 2019-03-13 05:02

It might also be worth mentioning that, if you are using an auto-incrementing primary key for your models, you will need to coerce it into a string, eg:

def __unicode__(self):
    return str(self.pk)
查看更多
▲ chillily
4楼-- · 2019-03-13 05:06

Add a __unicode__() method to Host. To show the primary key of your host objects, you'd want something like:

class Host(models.Model):
    host = models.CharField(max_length=100, primary_key=True)

    def __unicode__(self):
        return self.pk

    ...

You might want to think about showing the contents of the host field:

class Host(models.Model):
    host = models.CharField(max_length=100, primary_key=True)

    def __unicode__(self):
        return self.host

    ...

You'll need to do something similar for every model you've got.

For Python 3 compatibility, you'll want to do something like this (see the documentation):

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

    ...
查看更多
登录 后发表回答