El panel de administración de Django muestra los campos many-to-many como enlaces.
Tratando de hacer que mi administrador de Django muestre una lista de objetos relacionados como hipervínculos a esos objetos. Estos objetos están relacionados a través de una relación de muchos a muchos.
Usando una combinación de esta respuesta y esta respuesta, llegué a:
class MyObject(models.Model):
related = models.ManyToManyField(RelatedObject)
class RelatedObject(models.Model):
name = models.CharField(max_length=191)
class MyAdmin(admin.ModelAdmin):
list_display = ("rel",)
def rel(self, obj):
return[self.link_to_object(related_object) for related_object in obj.related.all()]
def link_to_object(self, obj):
link = reverse("admin:<app>_relatedobject_change", args=[obj.id])
return format_html(f"<a href="{link}">{obj.name}</a>")
Sin embargo, esto me da una lista de hrefs, no una lista de enlaces.
Si en su lugar cambio:
def rel(self, obj):
return self.link_to_object(obj.related.get(pk=1))
Devuelve un buen enlace (donde existe esa relación), pero no puedo hacer que esto se replique cuando se recuperan varios objetos.
¿Hay alguna manera de hacer que el administrador devuelva una lista de hipervínculos?
Señalaré que también está este método de linkify flotando por ahí, pero solo funciona para una ForeignKey, no para muchos a muchos, y no veo cómo adaptarlo.
davy.ai
Para mostrar una lista de hipervínculos a objetos relacionados en Django admin cuando los objetos están relacionados a través de una relación muchos a muchos, se puede modificar el método
rel
en la claseMyAdmin
de la siguiente manera:Este método utiliza la función
format_html_join
para crear una lista separada por comas de enlaces a los objetos relacionados. La funciónreverse
se usa para generar la URL de la página de cambio de cada objeto relacionado y el atributoname
de cada objeto relacionado se usa como texto del enlace.Tenga en cuenta que debe reemplazar
app_label
por la etiqueta real de su aplicación Django en la funciónreverse
.También tenga en cuenta que se ha asignado al método
rel
un atributoshort_description
para especificar el encabezado de columna en la vista de lista del administrador.