2009-10-20 9 views
11

Trong Django 1.1 admin, khi tôi đi để thêm hoặc thay đổi một đối tượng, đối tượng của tôi được hiển thị như:Làm Django quản trị hiển thị Primary Key chứ không phải là kiểu Object của mỗi đối tượng

Select host to change 
    * Add host 

    Host object 
    Host object 
    Host object 
    Host object 
    Host object 

Điều này xảy ra cho tất cả các mô hình trong trang web của tôi, không chỉ là Máy chủ lưu trữ.

Thay vì hiển thị cùng tên cho từng đối tượng, tôi muốn Django hiển thị khóa chính.

Select host to change 
    * Add host 

    machine1 
    machine2 

Đây là mã của tôi:

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 để kiểm soát các lĩnh vực được hiển thị trên trang danh sách thay đổi của người quản trị . "

Tuy nhiên, điều này dường như không hoạt động. Tôi có làm điều gì sai?

Trả lời

32

Thêm phương thức __unicode__() vào Host. Để hiển thị các khóa chính của các đối tượng máy chủ của bạn, bạn muốn một cái gì đó như:

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

    def __unicode__(self): 
     return self.pk 

    ... 

Bạn có thể muốn suy nghĩ về hiển thị nội dung của trường host:

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

    def __unicode__(self): 
     return self.host 

    ... 

Bạn sẽ cần phải làm một cái gì đó tương tự cho mọi mô hình bạn đã có.

Đối với 3 khả năng tương thích Python, bạn sẽ muốn làm một cái gì đó như thế này (xem 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 

    ... 
10

contrib.admin đã được làm lại trong 1.0, và cũ Admin lớp bên trong mô hình không còn làm việc. Những gì bạn cần là ModelAdmin phân lớp trong mô-đun your_application.admin, ví dụ:

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

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

admin.site.register(Host, HostAdmin) 

Hoặc sử dụng __unicode__ trong chính mô hình, ví dụ:

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

    def __unicode__(self): 
     return self.host 
3

Nó cũng có thể là đáng nói rằng, nếu bạn đang sử dụng một khóa chính tự động incrementing cho các mô hình của bạn, bạn sẽ cần phải ép buộc nó vào một chuỗi, ví dụ:

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