2009-09-12 11 views
15

Quando si visualizza la lista di modifica amministratore per un modello, è possibile rendere le colonne che corrispondono ai collegamenti di chiavi esterne alle rispettive pagine? Un semplice esempio è che ho un oggetto Foo che contiene Bar come chiave esterna. Se visualizzo la lista di modifica dell'amministratore per Foo (e l'ho impostato per includere la barra nelle colonne display_list), la colonna principale si collegherebbe alla pagina di modifica dell'istanza di Foo mentre la colonna della barra si collegherebbe alla pagina di modifica dell'istanza di Boo. Capisco che posso ignorare il modello che è stato utilizzato, ma ero curioso di sapere se c'era una soluzione che non lo richiedeva.Cambia elenco link a cambio chiave esterna pagina

risposta

21

È possibile definire un metodo personalizzato da utilizzare nell'elenchanger che restituisce l'HTML del collegamento.

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 

Un problema con la tua domanda come detto - se Foo ha una chiave esterna per bar, poi ogni link foo per una singola barra, in modo da poter creare un collegamento alla pagina di modifica per quel bar. Tuttavia, ogni barra si collega a più foos, quindi non ha senso chiedere un link alla 'pagina di modifica dell'istanza di Foo'. Che cosa si può fare è link alla pagina modifiche per Foo con il filtro impostato per visualizzare solo le istanze che puntano alla Bar:

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

Farò una prova. Quello che intendevo collegando alla pagina di modifica di Foo è solo per mantenere il collegamento predefinito alla pagina di modifica di Foo dalla lista di modifica di Foo (ammetto che non ero molto chiaro con esso). – Adam

+2

Qualsiasi aggiornamento su questo in 1.4 o 1.5 (voglio dire questo sembra una grande aggiunta a Django stesso quindi forse è già aggiunto a 'contrib.admin')? –

1

ho trovato e piaciuto risposta di Daniel, anche se la variante changelist spazza via tutte le modifiche l'ho già fatto Quindi questo è un modo per risolvere questo:

prima cosa è necessario per ottenere un riferimento alla richiesta, si può fare che avvolgendo changelist_view o queryset come ho fatto io:

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 

Che vi darà un filtro all'interno delle righe dell'elenco dei cambiamenti. Ho risposto a questa domanda in un'altra domanda, ma questo era il posto in cui sono arrivato per primo, quindi volevo registrarlo qui. :-)