get_url - Enlace en django admin a clave externa objeto
django admin template (4)
Tengo un modelo A con ForeignKey para un modelo B. En el administrador de Django, ¿cómo puedo agregar un enlace en la página de administración del modelo A junto al campo ForeignKey que abre la página de administración del modelo B?
Además de la respuesta aceptada, en las versiones más recientes de Django (1.10, 1.11 y 2.0), el método inverso se encuentra ahora en el paquete django.urls ( consulte este enlace ).
Además, tienes que usar el método format_html para generar HTML en el administrador. Así que los allow_tags se vuelven inútiles.
Finalmente, para agregar un enlace a la página de edición de un usuario, tengo esta función en admin.py:
from django.urls import reverse
from django.utils.html import format_html
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 format_html(''<a href="{}">Edit {}</a>'', link, obj.user.username)
link_to_user.short_description = ''Edit user''
Django 2.0+ y Python 3.5+:
from django.urls import reverse
from django.utils.html import escape
@admin.register(models.YourModel)
class YourModelAdmin(BaseModelAdmin):
def model_str(self, obj: models.YourModel):
link = reverse("admin:module_model_change", args=[obj.model.id])
return mark_safe(f''<a href="{link}">{escape(obj.model.__str__())}</a>'')
model_str.short_description = ''Model''
model_str.admin_order_field = ''model'' # Make row sortable
list_display = (
''model_str'',
)
Hay una solución más fácil hoy en día, con related
al campo de clave externa a vincular:
class YourModelAdmin(model.modelAdmin):
list_display = ["field_one", "field_two", "related"]
list_display_links = ["field_one", "related"]
Puedes hacer lo siguiente:
modelos.py (ejemplo):
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
Reemplace yourapp con el nombre de su aplicación.