2010-10-22 33 views
16

Ich versuche, den Link für ein Objekt in der Django-Admin-Liste zu ändern. Hier ist, was ich bisher habe:Änderung Liste Anzeige Link in Django Admin

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" 

Dies erzeugt eine andere Verknüpfung innerhalb der ursprünglichen Liste Anzeige Link z.

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

Antwort

24

Die Lösung bestand darin, die Initialisierung zu überschreiben und die list_display_links auf Keine, z.

19

Ich glaube, die richtige Art und Weise, dies zu tun ist, Unterklasse ChangeList und überschreiben die Methode url_for_result, um die richtige Änderung URL zu erstellen.

Aufschalten die get_changelist in der admin.ModelAdmin Unterklasse die neue Klasse zurückzukehren:

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

Dies sollte die akzeptierte Antwort. –

0

Nachdem Sie diese Idee selbst (aus der Listenanzeige auf die aktuelle Seite verlinken) Ich zweiten Gedanken hatte. Es gibt zwei Seiten, die Sie berücksichtigen müssen: die Admin-Seite des Modells und die tatsächliche öffentliche Seite (wahrscheinlich Detailansicht) des Modells. Wenn Sie vom Admin auf die öffentliche Seite verlinken (auch wenn es sich um eine CMS-Seite handelt), verlieren Sie die Verbindung zur Admin-Seite.

Die Admin-Seite des Modells verlinkt über den Link "Vorschau" (wird regelmäßig oben rechts platziert) auf die öffentliche Seite. Dieser Link stammt von model_object.get_absolute_url().

Wenn Sie also ändern möchten, wo der Vorschau-Link zeigt, müssen Sie einfach get_absolute_url() überschreiben. Und in diesem Fall ist es wahrscheinlich eine gute Sache, dass Sie das sowieso tun, weil Sie wahrscheinlich diese URL auch an allen anderen Orten verwenden möchten.

0

Standardmäßig ist die erste Option der Listenanzeige eine Verknüpfung zum Bearbeitungsbildschirm. Wenn Sie eine andere Spalte oder Spalten mögen, dass Link zu sein, eine sehr einfache Art und Weise ist, wie folgt:

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

Wenn foo_link keine Eigenschaft des Modells ist, sollte es eine aufrufbare wie folgt sein:

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 

Ein komplettes Beispiel aus meinem Projekt:

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"