2011-05-04 79 views
6

我已經創建了一個自定義管理類,以在我的Django應用中顯示評論管理。我想要做的是將「對象ID」下的項目鏈接到它們各自對象的編輯對象頁面。我將如何實現這一目標?如何鏈接到Django管理視圖中的不同對象?

我的評論管理:

class MyCommentsAdmin(admin.ModelAdmin): 
    fieldsets = (
     (_('Content'), 
      {'fields': ('user', 'user_name', 'user_email', 'user_url', 'comment')} 
     ), 
     (_('Metadata'), 
      {'fields': ('submit_date', 'ip_address', 'is_public', 'is_removed')} 
     ), 
    ) 

    list_display = ('id', 'name', 'comment', 'content_type', 'object_pk', 'ip_address', 'submit_date', 'is_public', 'is_removed') 
    list_filter = ('submit_date', 'site', 'is_public', 'is_removed') 
    date_hierarchy = 'submit_date' 
    list_display_links = ('id','comment',) 
    ordering = ('-submit_date',) 
    raw_id_fields = ('user',) 
    search_fields = ('comment', 'user__username', 'user_name', 'user_email', 'ip_address') 

admin.site.unregister(Comment) 
admin.site.register(Comment, MyCommentsAdmin) 

謝謝!

回答

11

在admin類上定義一個自定義方法,並在您的list_display元組中引用該方法。

from django.core.urlresolvers import reverse 
class MyCommentsAdmin(admin.ModelAdmin): 

    list_display = ('id', 'name', 'comment', 'content_type', 'object_link', 'ip_address', 'submit_date', 'is_public', 'is_removed') 
    list_select_related = True 

    def object_link(self, obj): 
     ct = obj.content_type 
     url = reverse('admin:%s_%s_change' % (ct.app_label, ct.model), args=(obj.id,)) 
     return '<a href="%s">%s</a>' % (url, obj.id) 
    object_link.allow_tags = True 

注意我已經添加list_select_related=True,作爲object_link方法引用CONTENT_TYPE模型,這否則會造成額外查詢的整個負載。

+0

謝謝。這裏有一個小小的錯誤。返回的id不是對象的ID,而是註釋的ID。我該如何解決這個問題? – rabbid 2011-05-04 09:20:10

+0

我將'obj.id'改爲'obj.object_pk'。謝謝! – rabbid 2011-05-04 09:27:12

+2

我使用Django 1.7,需要將'obj.content_type'更改爲'obj._meta',並將'ct.model'更改爲'ct.model_name'。 – adam 2015-12-14 18:47:29