2010-10-22 22 views
16

Sto provando a cambiare il link per un oggetto nel display della lista admin di Django. Ecco cosa ho finora:cambia visualizzazione link di visualizzazione 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" 

Questo produce un altro collegamento all'interno del collegamento di visualizzazione elenco originale, ad es.

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

risposta

24

La soluzione era di ignorare init e impostare i list_display_links Nessuno esempio

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

Credo che il modo corretto di farlo, sottoclassi ChangeList e sovrascriva il metodo url_for_result per creare l'URL di modifica corretto che si desidera.

Override l'get_changelist nella sottoclasse admin.ModelAdmin per riportare la nuova classe:

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

Questa dovrebbe essere la risposta accettata. –

0

Dopo aver seguito questa idea io stesso (per collegare dalla visualizzazione lista alla pagina effettiva) ho avuto ripensamenti. Ci sono due pagine da considerare: la pagina di amministrazione del modello e la pagina pubblica effettiva (probabilmente la vista di dettaglio) del modello. Se si collega dall'amministratore alla pagina pubblica (anche se si tratta di una pagina CMS) si perde la connessione alla sua pagina di amministrazione.

La pagina di amministrazione del modello si collega effettivamente alla pagina pubblica tramite il collegamento "Anteprima" (posizionato regolarmente in alto a destra). Questo collegamento deriva da model_object.get_absolute_url().

Quindi, se si desidera modificare il punto in cui i punti di collegamento dell'anteprima, è sufficiente eseguire l'override di get_absolute_url(). E in questo caso, probabilmente è una buona cosa farlo, comunque, perché probabilmente vorrai usare quell'URL in tutti gli altri posti.

0

Per impostazione predefinita, la prima opzione di visualizzazione dell'elenco sarà il collegamento alla schermata di modifica. Se si desidera un'altra colonna o le colonne di essere quel link, un modo molto semplice è la seguente:

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

Se foo_link non è una proprietà del modello, dovrebbe essere un richiamabile come la seguente:

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 

Un esempio completo dal mio progetto:

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" 
Problemi correlati