代码之家  ›  专栏  ›  技术社区  ›  mikemaccana

让Django admin显示主键,而不是每个对象的对象类型

  •  11
  • mikemaccana  · 技术社区  · 15 年前

    在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_显示

    设置list_display以控制在管理员的更改列表页面上显示哪些字段。"

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

    3 回复  |  直到 15 年前
        1
  •  33
  •   Dominic Rodger    11 年前

    添加一个 __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兼容,您需要执行类似的操作(请参见 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
    
        ...
    
        2
  •  10
  •   Cat Plus Plus    15 年前

    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
    
        3
  •  3
  •   ropable    15 年前

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

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