40 votes

Django Admin lien vers des objets associés

Mon application a des utilisateurs qui créent des pages. Dans l'écran Page de l'administrateur, j'aimerais répertorier l'utilisateur qui a créé la page, et dans cette liste, j'aimerais que le nom d'utilisateur ait un lien qui mène à la page de l'utilisateur dans admin (pas la page).

 class PageAdmin(admin.ModelAdmin):
    list_display = ('name', 'user', )
    list_display_links = ('name','user',)
admin.site.register(Page, PageAdmin)

J'espérais qu'en en faisant un lien dans list_display, il serait lié par défaut à l'objet utilisateur réel, mais il va toujours à la page.

Je suis sûr qu'il me manque quelque chose de simple ici.

21voto

Udi Points 6298

Ajoutez ceci à votre modèle :

   def user_link(self):
      return '<a href="%s">%s</a>' % (reverse("admin:auth_user_change", args=(self.user.id,)) , escape(self.user))

  user_link.allow_tags = True
  user_link.short_description = "User" 

Vous devrez peut-être également ajouter ce qui suit en haut de models.py :

   from django.template.defaultfilters import escape
  from django.core.urls import reverse

En admin.py , en list_display , ajouter user_link :

 list_display = ('name', 'user_link', )

Pas besoin de list_display_links .

8voto

Janusz Skonieczny Points 1587

Vous devez utiliser format_html pour les versions modernes de Django

 @admin.register(models.Foo)
class FooAdmin(admin.ModelAdmin):
    list_display = ('ts', 'bar_link',)

    def bar_link(self, item):
        from django.shortcuts import resolve_url
        from django.contrib.admin.templatetags.admin_urls import admin_urlname
        url = resolve_url(admin_urlname(models.Bar._meta, 'change'), item.bar.id)
        return format_html('<a href="{url}">{name}</a>'.format(url=url, name=str(item.bar)))

5voto

imbolc Points 99

Je me suis retrouvé avec une aide simple:

 from django.shortcuts import resolve_url
from django.utils.safestring import SafeText
from django.contrib.admin.templatetags.admin_urls import admin_urlname
from django.utils.html import format_html


def model_admin_url(obj: Model, name: str = None) -> str:
    url = resolve_url(admin_urlname(obj._meta, SafeText("change")), obj.pk)
    return format_html('<a href="{}">{}</a>', url, name or str(obj))

Ensuite, vous pouvez utiliser l'assistant dans votre model-admin :

 class MyAdmin(admin.ModelAdmin):
    readonly_field = ["my_link"]

    def my_link(self, obj):
        return model_admin_url(obj.my_foreign_key)

4voto

rednaw Points 3856

J'en avais besoin pour beaucoup de mes pages d'administration, j'ai donc créé un mixin pour cela qui gère différents cas d'utilisation. Tu ajoutes juste :

 change_links = ['field']

à votre classe ModelAdmin

Voir la page GitHub pour plus d'informations. Essayez-le et dites-moi comment cela fonctionne !

https://github.com/gitaarik/django-admin-relation-links

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X