2010-01-28 10 views
47

Ho un'interfaccia di amministrazione di django e nella lista dei modelli voglio una colonna personalizzata che sarà un collegamento ipertestuale utilizzando uno dei valori dei campi. Fondamentalmente uno dei campi dei modelli è un url e vorrei che la colonna avesse quell'URL in un collegamento ipertestuale cliccabile. Questo collegamento dovrà avere aggiunto un URL aggiuntivo come percorso relativo nel campo del modello.Come si aggiunge una colonna personalizzata con un collegamento ipertestuale nell'interfaccia di amministrazione di django?

+1

Possibile duplicato di [Come aggiungere collegamenti cliccabili a un campo nell'amministratore di Django?] (Http://stackoverflow.com/questions/1949248/how-to-add-clickable-links-to-a-field-in -django-admin) – Louis

risposta

60

Definire un metodo nella classe ModelAdmin e impostare l'attributo allow_tags su True. Ciò consentirà al metodo di restituire codice HTML senza escape per la visualizzazione nella colonna.

Quindi elencarlo come voce nell'attributo ModelAdmin.list_display.

Esempio:

class YourModelAdmin(admin.ModelAdmin): 
    list_display = ('my_url_field',) 

    def my_url_field(self, obj): 
     return '<a href="%s%s">%s</a>' % ('http://url-to-prepend.com/', obj.url_field, obj.url_field) 
    my_url_field.allow_tags = True 
    my_url_field.short_description = 'Column description' 

vedere la documentazione per ModelAdmin.list_display per maggiori dettagli.

+0

Ho scoperto l'altro giorno che in realtà non è necessario il tag 'a', poiché l'amministratore di Django trasformerà automaticamente l'URL in un collegamento ipertestuale. Non sono al mio PC da lavoro, quindi potrei sbagliarmi. Nel mio caso, non ho avuto bisogno di impostare 'allow_tags'. Ho anche creato una funzione 'get_url()' sul mio modello, al contrario del mio modello di amministrazione, ma è piuttosto banale. Comunque, la tua strada è la migliore se vogliamo aprire il link in una nuova finestra con 'target = _blank' - Spero che questo sia utile. –

10

Utilizzare l'utilità format_html. Questo sfuggirà a qualsiasi codice HTML dai parametri e contrassegnerà la stringa come sicura da usare nei modelli. L'attributo del metodo allow_tags è stato deprecato in Django 1.9.

from django.utils.html import format_html 

class MyModelAdmin(admin.ModelAdmin): 
    list_display = ['show_url', ...] 
    ... 

    def show_url(self, obj): 
     return format_html("<a href='http://pre.com{0}'>{0}</a>", obj.url) 

Ora gli utenti di amministrazione sono al sicuro anche in caso di:

url == '<script>eval(...);</script>' 

Vedi the documentation per maggiori informazioni.

Problemi correlati