2009-09-12 22 views
15

Khi xem danh sách thay đổi quản trị cho một mô hình, có thể tạo các cột tương ứng với khóa ngoài liên kết đến các trang tương ứng của chúng không? Một ví dụ đơn giản là tôi có một đối tượng Foo có chứa Bar như một khóa ngoại. Nếu tôi đang xem danh sách thay đổi quản trị cho Foo (và nó được thiết lập để bao gồm Bar trong cột display_list), cột chính sẽ liên kết đến trang chỉnh sửa của cá thể Foo trong khi cột Bar sẽ liên kết đến trang chỉnh sửa của cá thể Boo. Tôi hiểu tôi có thể ghi đè lên các mẫu được sử dụng, nhưng tôi đã tò mò nếu có một giải pháp mà không yêu cầu đó.Thay đổi liên kết danh sách thành trang thay đổi khóa ngoài

Trả lời

21

Bạn có thể xác định phương thức tùy chỉnh để sử dụng trong danh sách thay đổi trả về HTML của liên kết.

from django.core.urlresolvers import reverse 

class MyFooAdmin(admin.ModelAdmin): 
    list_display = ('foo', 'bar_link') 

    def bar_link(self, obj): 
     url = reverse('admin:myapp_bar_change', args=(obj.pk,)) 
     return '<a href="%s">Edit Bar</a>' % url 
    bar_link.allow_tags = True 

Một vấn đề với câu hỏi của bạn như sau - nếu Foo có liên kết đến một thanh, để bạn có thể liên kết đến trang chỉnh sửa cho thanh đó. Tuy nhiên, mỗi thanh liên kết với nhiều foos, do đó, nó không có ý nghĩa để yêu cầu một liên kết đến 'trang chỉnh sửa của cá thể Foo'. liên kết đến trang sách thay đổi cho Foo với bộ lọc thiết lập để chỉ hiển thị các trường hợp liên kết đến Bar này những gì bạn có thể làm là:

def foo_link(self, obj): 
     url = reverse('admin:myapp_foo_changelist') 
     return '<a href="%s?bar=%s">See Foos</a>' % (url, obj.pk) 
    foo_link.allow_tags = True 
+0

Tôi sẽ thử. Những gì tôi có nghĩa là bằng cách liên kết đến trang thay đổi Foo chỉ là để duy trì liên kết mặc định đến trang thay đổi Foo từ danh sách thay đổi Foo (Tôi thừa nhận tôi đã không rõ ràng với nó). – Adam

+2

Bất kỳ cập nhật nào về điều này trong 1,4 hoặc 1,5 (tôi có nghĩa là điều này trông giống như một bổ sung tuyệt vời cho Django chính nó vì vậy có lẽ nó đã được thêm vào 'contrib.admin')? –

1

Tôi tìm thấy và thích câu trả lời của Daniel, mặc dù các biến thể danh sách thay đổi xóa đi mọi thay đổi bạn đã thực hiện. Vì vậy, đây là một cách để khắc phục điều đó:

Trước tiên, bạn cần phải nhận được một tham chiếu đến các yêu cầu, bạn có thể làm điều đó bằng cách gói changelist_view hoặc queryset như tôi đã làm:

class CountryAdmin(ModelAdmin): 
    model = Country 
    list_display = ('pk', 'continent_changelist') 

    # ... 

    def queryset(self, request): 
     self._get_params = request.GET 
     return super(CountryAdmin, self).queryset(request) 

    def continent_changelist(self, obj): 
     url = reverse('admin:yourapp_country_changelist') 
     querystring = self._get_params.copy() 
     querystring['continent__id__exact'] = obj.continent.pk 
     return u'<a href="{0}?{1}">{2}</a>'.format(
      url, querystring.urlencode(), obj.continent) 
    continent_changelist.allow_tags = True 

Điều đó sẽ cung cấp cho bạn một bộ lọc bên trong các hàng changelist. Tôi đã trả lời câu hỏi này trong một câu hỏi khác, nhưng đây là nơi tôi thực sự đến trước, vì vậy muốn ghi lại nó ở đây. :-)

Các vấn đề liên quan