2015-03-03 15 views

risposta

23

È possibile effettuare le seguenti operazioni:

models.py (esempio):

model B(models.Model): 
    name = models.CharField(max_length=20) 

model A(models.Model): 
    field1 = models.CharField(max_length=20) 
    Bkey = models.ForeignKey(B) 

admin.py

from django.core import urlresolvers 

class AAdmin(admin.ModelAdmin): 
    list_display = ["field1","link_to_B"] 
    def link_to_B(self, obj): 
     link=urlresolvers.reverse("admin:yourapp_b_change", args=[obj.B.id]) #model name has to be lowercase 
     return u'<a href="%s">%s</a>' % (link,obj.B.name) 
    link_to_B.allow_tags=True 

Sostituire yourapp con il nome della vostra applicazione.

+5

Solo nel caso in cui qualcuno utilizza questa risposta troppo, il vostro modello deve essere in lettere minuscole nella funzione 'reverse' . Quello sarebbe: '" admin: yourapp_yourmodel_change "'. –

+0

@ Raphaël Gomès: grazie per l'input, modificato la risposta. –

+0

quale errore ottieni? –

2

Inoltre la risposta accettata, nelle versioni più recenti di Django (1.10, 1.11 e 2.0), il metodo inverso è ora nel pacchetto django.urls (cfr this link).

Inoltre, è necessario utilizzare il metodo mark_safe per l'output HTML nell'amministratore. Quindi il allow_tags diventa inutile.

Infine, per aggiungere un collegamento per l'utente, ho questa funzione nel admin.py:

from django.urls import reverse 
from django.utils.safestring import mark_safe 


class ObjectAdmin(admin.ModelAdmin): 
    list_display = ('name', 'link_to_user') 

    def link_to_user(self, obj): 
     link = reverse("admin:auth_user_change", args=[obj.user.id]) 
     return mark_safe('<a href="%s">Edit %s</a>' % (link, obj.user.username)) 
    link_to_user.short_description = 'Edit user' 
+0

Consiglierei di usare ['format_html'] (https: //docs.djangoproject .com/it/stable/ref/utils/# django.utils.html.format_html) invece di 'mark_safe'. – batisteo

Problemi correlati