2010-10-22 80 views
16

我想改變在Django管理列表顯示對象的鏈接。這是我到目前爲止:更改列表顯示鏈接在Django管理員

class FooModelAdmin(admin.ModelAdmin): 
    fields = ('foo','bar') 
    list_display = ('foo_link','bar') 

    def foo_link(self,obj): 
     return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj) 
    domain_link.allow_tags = True 
    domain_link.short_description = "foo" 

這會產生原始列表中的另一個鏈接顯示鏈接,例如,

<a href="/admin/app/model/pk/"><a href="/foos/foo/">Foo</a></a> 

回答

24

解決方案是覆蓋init並將list_display_links設置爲無例如,

class FooModelAdmin(admin.ModelAdmin): 
    fields = ('foo','bar') 
    list_display = ('foo_link','bar') 

    def foo_link(self,obj): 
     return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj) 
    foo_link.allow_tags = True 
    foo_link.short_description = "foo" 
    def __init__(self,*args,**kwargs): 
     super(FooModelAdmin, self).__init__(*args, **kwargs) 
     self.list_display_links = (None,) 
19

我相信這樣做的正確方法是繼承ChangeList並覆蓋url_for_result方法以創建所需的正確更改網址。

覆蓋在admin.ModelAdmin子類的get_changelist返回新類:

from django.contrib.admin.views.main import ChangeList 
from django.contrib.admin.util import quote 

class FooChangeList(ChangeList): 
    def url_for_result(self, result): 
     pk = getattr(result, self.pk_attname) 
     return '/foos/foo/%d/' % (quote(pk)) 

class FooAdmin(admin.ModelAdmin): 
    def get_changelist(self, request, **kwargs): 
     return FooChangeList 
+6

這應該是公認的答案。 – 2014-12-10 15:43:48

0

下面這個想法我自己,我有第二個想法(從列表中顯示鏈接到實際的頁面)之後。您必須考慮兩個頁面:模型的管理頁面和模型的實際公共頁面(可能是詳細視圖)。如果您從管理員鏈接到公共頁面(即使它是CMS頁面),則會斷開與其管理頁面的連接。

模型的管理頁面實際上通過「預覽」鏈接鏈接到公共頁面(通常位於右上角)。此鏈接源自model_object.get_absolute_url()

所以,如果你想改變預覽鏈接的位置,你只需要覆蓋get_absolute_url()。在這種情況下,無論如何,這可能是一件好事,因爲您可能還想在其他所有地方使用該網址。

0

默認情況下,列表顯示的第一個選項將鏈接到編輯屏幕。如果你想另一列或列是鏈接,一個很簡單的方法如下:

class FooModelAdmin(admin.ModelAdmin): 
    list_display = ('foo_link', 'bar', 'another_bar',) 
    list_display_links = ('foo_link', 'another_bar',) 

如果foo_link是不是模型的屬性,它應該是一個可調用類似如下:

class FooModelAdmin(admin.ModelAdmin): 
    list_display = ('foo_link', 'bar', 'another_bar',) 
    list_display_links = ('foo_link', 'another_bar',) 
    def foo_link(self, obj): 
     return "%s blah blah" % obj.some_property # or anything you prefer e.g. an edit button 

從我的項目完整的例子:

class SchoolTeacherAdmin(admin.ModelAdmin): 
    list_display = ('name', 'designation', 'school_name', 'school_code', 'date_of_birth', 'mobile', 'nid', 'edit',) 
    list_display_links = ('edit',) 

    def school_code(self, obj): 
     return obj.school.code 

    def school_name(self, obj): 
     return obj.school.name.upper() 

    def edit(self, obj): 
     return "Edit"