es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 clase MyAdmin de la siguiente manera:

    class MyAdmin(admin.ModelAdmin):
        list_display = ("rel",)
    
        def rel(self, obj):
            return format_html_join(
                ", ",  # use una coma para separar los enlaces
                '<a href="{}">{}</a>',
                ((reverse("admin:app_label_relatedobject_change", args=(related.id,)), related.name)
                 for related in obj.related.all()),
            )
    
        rel.short_description = "Objetos relacionados"
    

    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ón reverse se usa para generar la URL de la página de cambio de cada objeto relacionado y el atributo name 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ón reverse.

    También tenga en cuenta que se ha asignado al método rel un atributo short_description para especificar el encabezado de columna en la vista de lista del administrador.

Comments are closed.