2012-01-20 35 views
6

Tôi gặp sự cố lạ trong quản trị django list_display. Bất cứ khi nào tôi thêm khóa ngoại vào list_display, toàn bộ danh sách thay đổi danh sách sẽ trống khi chỉ hiển thị tổng số mục nhập.Danh sách quản trị Django Hiển thị + ForeignKey = Danh sách thay đổi trống

models.py:

class Organization(models.Model): 
    org_id = models.AutoField(primary_key=True) 
    org_name = models.CharField(max_length=288) 

    def __unicode__(self): 
     return self.org_name 

    class Meta: 
     db_table = u'organization' 

class Server(models.Model): 
    server_id = models.AutoField(primary_key=True) 
    server_name = models.CharField(max_length=135,verbose_name="Server Name") 
    org = models.ForeignKey(Organization,verbose_name="Organization") 

    def __unicode__(self): 
     return self.server_name 

    class Meta: 
     db_table = u'server' 

admin.py:

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name','org') 
admin.site.register(Server,ServerAdmin) 

Bây giờ tôi mong đợi mã này để chỉ cho tôi tên tổ chức trong ChangeList View, Nhưng thay vào đó tôi nhận được điều này:

empty changelist :(

Nếu tôi loại bỏ các org trong list_display của ServerAdmin lớp, tôi có được điều này:

change list with data :(

tôi không sửa đổi các mẫu hoặc ghi đè lên bất kỳ ModelAdmin phương pháp. Tôi đang sử dụng Mysql (5.1.58) làm cơ sở dữ liệu của tôi đi kèm với kho lưu trữ ubuntu 11.10.

Tôi sẽ rất vui nếu tôi có thể nhận được sự hỗ trợ cho những người có vấn đề này. Cảm ơn trước.

+0

trong 'models.py' tôi thấy 'TlxServer' và trong' admin.py' chỉ' Server'. Đó có phải là lỗi đánh máy không? – jcollado

+0

Bạn không cần phải xác định một AutoField. Django tự động tạo khóa chính cho mỗi bảng. –

+0

@jcollado: Đó là lỗi chính tả: P giả sử là 'Máy chủ' – Pannu

Trả lời

7

Tôi thứ hai Stefano trên thực tế là null=True, blank=True sẽ được thêm vào. Nhưng, tôi nghĩ bạn chỉ cần thêm nó vào trường org_name của mô hình Organization. Điều đó sẽ thực hiện theo cách của bạn thông qua. Nó phải được thực hiện bởi vì bạn đã chạy inspectdb để tạo mô hình từ DB kế thừa của mình. Và có lẽ bảng organization trong DB có một chuỗi rỗng được lưu trữ. Vì vậy, việc thêm vào ở trên sẽ cho phép Quản trị viên có một trường/cột trống được hiển thị.

Hơn nữa, bạn cũng có thể thử sử dụng callbacks trong trường hợp bạn không muốn thực hiện thay đổi đối với định nghĩa mô hình của mình như trên.

+0

Được rồi! Đã có một tình huống tương tự với một mô hình khác như 'Organization' có' ForeignKey' thành 'User'. Nhờ bạn và 'django-debug-toolbar' Zero' trên' INNER JOINS' gây ra toàn bộ vấn đề. 'inspectdb' không chỉ rõ' null = True, balnk = True' và tôi quá lười;) để vượt qua các mô hình kiểm tra và cơ sở dữ liệu. Cảm ơn người đàn ông tôi nợ bạn một để giải quyết vấn đề tìm kiếm bí ẩn này. – Pannu

+0

Bất cứ lúc nào Pannu. Tất cả đều ở đây để tìm hiểu và tôi cũng đã học được từ vấn đề của bạn. –

1

Xem: https://stackoverflow.com/a/163968/1104941

Công việc sau có phù hợp với bạn không?

admin.py:

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name','org__org_name') 
admin.site.register(Server,ServerAdmin) 
+0

Tôi đã thử giải pháp của bạn, mặc dù lạ vì nó có thể âm thanh, nó dường như không hoạt động. Nó giữ popping một lỗi ''org__org_name' không phải là một callable hoặc một thuộc tính của 'ServerAdmin' hoặc tìm thấy trong mô hình 'Server'.' cảm ơn anyways người đàn ông. – Pannu

+0

Bạn không thể sử dụng các cụm từ mở rộng mối quan hệ trong list_display, điều này có thể rất hữu ích. Giải pháp thay thế là định nghĩa một phương thức trong lớp con ModelAdmin trả về giá trị bạn đang tìm kiếm và thêm tên của phương thức đó vào list_display. – glarrain

2

Hãy thử thêm null=True, blank=True cho tất cả các lĩnh vực mô hình của bạn.

Thông thường quản trị viên django sẽ không hoạt động được (do đó không hiển thị bản ghi trong danh sách) nếu hàng không xác thực ràng buộc mô hình.

+0

xin lỗi người đàn ông, Sandeep đã tinh chỉnh câu trả lời của bạn. Cảm ơn anyways :) – Pannu

0

Tôi đã có một vấn đề tương tự và giải quyết nó như thế này (sử dụng ví dụ của bạn):

class ServerAdmin(admin.ModelAdmin): 
    list_display = ('server_name', 'get_org') 

    def get_org(self, obj): 
     return obj.org.org_name 

    get_org.short_description = 'Org' 

admin.site.register(Server,ServerAdmin) 
Các vấn đề liên quan