Ho un modello A con ForeignKey in un modello B. Nell'amministratore di Django, come posso aggiungere un collegamento nella pagina di amministrazione del modello A accanto al campo ForeignKey che apre il pagina di amministrazione del modello B?Collegamento in admin django all'oggetto chiave esterna
risposta
È 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.
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'
Consiglierei di usare ['format_html'] (https: //docs.djangoproject .com/it/stable/ref/utils/# django.utils.html.format_html) invece di 'mark_safe'. – batisteo
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 "'. –
@ Raphaël Gomès: grazie per l'input, modificato la risposta. –
quale errore ottieni? –